Forum Moderators: phranque

Message Too Old, No Replies

Rewriting 301 redirects

mod_rewrite defeating mod_alias redirect

         

TimCDN

11:32 am on Oct 22, 2009 (gmt 0)

10+ Year Member



Hi all

Hoping you can help a rookie out.

I have a redirect for an old web page from an old web site.

eg
redirect 301 /Can%20Lure%20Companies.htm

But because of my rewrite rules the URL is never redirected because it is rewritten first...

Any ideas? It is a standard Joomla .htaccess setup

########## Begin - Rewrite rules to block out some common exploits
## If you experience problems on your site block out the operations listed below
## This attempts to block the most common type of exploit `attempts` to Joomla!
#
# Block out any script trying to set a mosConfig value through the URL
RewriteCond %{QUERY_STRING} mosConfig_[a-zA-Z_]{1,21}(=¦\%3D) [OR]
# Block out any script trying to base64_encode crap to send via URL
RewriteCond %{QUERY_STRING} base64_encode.*\(.*\) [OR]
# Block out any script that includes a <script> tag in URL
RewriteCond %{QUERY_STRING} (\<¦%3C).*script.*(\>¦%3E) [NC,OR]
# Block out any script trying to set a PHP GLOBALS variable via URL
RewriteCond %{QUERY_STRING} GLOBALS(=¦\[¦\%[0-9A-Z]{0,2}) [OR]
# Block out any script trying to modify a _REQUEST variable via URL
RewriteCond %{QUERY_STRING} _REQUEST(=¦\[¦\%[0-9A-Z]{0,2})
# Send all blocked request to homepage with 403 Forbidden error!
RewriteRule ^(.*)$ index.php [F,L]
#
########## End - Rewrite rules to block out some common exploits

# Uncomment following line if your webserver's URL
# is not directly related to physical file paths.
# Update Your Joomla! Directory (just / for root)

# RewriteBase /

########## Begin - Joomla! core SEF Section

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_URI} !^/index.php
RewriteCond %{REQUEST_URI} (/¦\.php¦\.html¦\.htm¦\.feed¦\.pdf¦\.raw¦/[^.]*)$ [NC]
RewriteRule (.*) index.php
RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization},L]

jdMorgan

2:35 pm on Oct 22, 2009 (gmt 0)

WebmasterWorld Senior Member 10+ Year Member



Re-code your mod_alias "redirect 301 /Can%20Lure%20Companies.htm" as a RewriteRule, and place it at the top of your other mod_rewrite code.

You may need to examine %{THE_REQUEST} using a RewriteCond to detect that encoded space character.

Jim

TimCDN

4:59 pm on Oct 22, 2009 (gmt 0)

10+ Year Member



Hi Jim

Could you provide me with an example of what the alias would look like, thanks

jdMorgan

5:58 pm on Oct 22, 2009 (gmt 0)

WebmasterWorld Senior Member 10+ Year Member



Your code with "Redirect 301" is handled by Apache mod_alias.

On the other hand, "RewriteRule" is handled by mod_rewrite.

These are two different Apache modules which handle two different sets of directives, and which use different syntax. Depending on your server setup, either one may run before the other.

In other words, the "code" in your .htaccess file is not processed in strict top-to-bottom order, but rather it is 'scanned' by each Apache module in turn, with each module executing only those directives that it understands.

Therefore, only directives belonging to the same module will execute "in order," and you cannot directly control execution order by the order you place directives in your .htaccess file -- The modules will be invoked in the order determined by the server config files, and you can't change that from the .htaccess level.

So, it sounds like mod_rewrite is running first and rewriting the request to your Joomla script before mod_alias ever gets a chance to see your "Redirect 301" directive.

Several useful resources are cited in our Forum Charter.

Jim

g1smd

5:32 pm on Oct 23, 2009 (gmt 0)

WebmasterWorld Senior Member 10+ Year Member Top Contributors Of The Month



In an attempt to be a universal solution, Joomla's .htaccess code is very inefficient.

The -f and -d checks are very server intensive for example.

jdMorgan

6:08 pm on Oct 23, 2009 (gmt 0)

WebmasterWorld Senior Member 10+ Year Member



True. At the very least, the final code-block above should be re-arranged to do the 'exists-checks' last, but some further improvement can also be gained by optimizing the regular-expressions patterns:

RewriteCond %{REQUEST_URI} !^/index\.php$
RewriteCond %{REQUEST_URI} (\.php¦\.html?¦\.feed¦\.pdf¦\.raw¦/[^.]*)$ [NC]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^ index.php
RewriteRule ^ - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization},L]

If you site is a busy one, you may actually notice a performance improvement from these minor changes, and they won't have any other effect on the behaviour of your server.

Important note: You must change the broken pipe "¦" characters above to solid pipe characters before use; Posting on this forum modifies the pipe characters.

Jim