I'm trying to add a simple 301 rule to the .htaccess file of a codeigniter site.
redirect 301 /newsletter http://sub.domain.com/newsletters/may2010
When I visit http://sub.domain.com/newsletter the redirect goes to
http://sub.domain.com/newsletters/may2010/?/newsletter
I'm not sure where the ?/newsletter is coming from. Full .htaccess file:
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
redirect 301 /newsletter http://sub.domain.com/newsletters/may2010
#Removes access to the system folder by users.
#Additionally this will allow you to create a System.php controller,
#previously this would not have been possible.
#'system' can be replaced if you have renamed your system folder.
RewriteCond %{REQUEST_URI} ^system.*
RewriteRule ^(.*)$ /index.php?/$1 [L]
#Checks to see if the user is attempting to access a valid file,
#such as an image or css document, if this isn't true it sends the
#request to index.php
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php?/$1 [L]
</IfModule>
<IfModule !mod_rewrite.c>
# If we don't have mod_rewrite installed, all 404's
# can be sent to index.php, and everything works as normal.
# Submitted by: ElliotHaughin
ErrorDocument 404 /index.php
</IfModule>
#####################################################
# CONFIGURE media caching
#
Header unset ETag
FileETag None
<FilesMatch "(?i)^.*\.(ico|flv|jpg|jpeg|png|gif|js|css)$">
Header unset Last-Modified
Header set Expires "Fri, 21 Dec 2012 00:00:00 GMT"
Header set Cache-Control "public, no-transform"
</FilesMatch>
#
#####################################################
<IfModule mod_deflate.c>
<FilesMatch "\.(js|css)$">
SetOutputFilter DEFLATE
</FilesMatch>
</IfModule>
How can I fix this?
Heh, this is Apache pulling a sneaky order-of-processing trick on you. As it turns out, the fact that you put your
Rewrite
command at the top of the file doesn't mean that it's what's actually executed first. What happens instead is thatmod_rewrite
is run first, followed bymod_alias
(which is responsible for handling yourRewrite
).This results in the following transformation, per
mod_rewrite
:mod_rewrite
happily sets the query string to?/newsletter
, but because you don't have thePT
flag specified, does not passthrough the rewritten URLindex.php
tomod_alias
. Therefore,mod_alias
still sees the/newsleter
path, redirects it tohttp://sub.domain.com/newsletters/may2010
, and appends the (now changed) query string?/newsletter
to the end to seal the deal. Fun stuff, right?Anyway, a quick-fix for this scenario would be to ignore requests for just
newsletter
: