AVProgrammer
AVProgrammer

Reputation: 1350

HTACCES mod rewrite, stacking rules

We have a rewrite rule that looks like this:

RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-l
RewriteRule (?!^(cms|images|js|mobile)(/.*|)$)^.*$ page.php [NC,L]

Which works as expected; if the file does not exist, forward to page.php which is a generic page and allows for pages with custom URLs.

We also want to force the www. to precede the domain: example.com -> www.example.com

For that, we use:

RewriteCond %{HTTP_HOST} ^example.com$
RewriteRule ^(.*)$ http://www.example.com/$1 [R=301,L]

This also works, but when the two are supposed to work together:

example.com/non-existent-file

We end up getting:

www.example.bom/page.php

Which defaults to our 404 page. How do I modify these rules to work together? I have tried playing with some of the different suffic characters (ie. removing the L in the [NC,L] in an attempt to get both rules to process).

I have also tried repeating the forward to page.php lines beneath the www redirect (and removing the L suffix) with no success.

The entire HTACCESS file looks like:

Options +FollowSymLinks
RewriteEngine On
RewriteBase   /

RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-l
RewriteRule (?!^(cms|images|js|mobile)(/.*|)$)^.*$ page.php [NC,L]

RewriteCond %{HTTP_HOST} ^example.com$
RewriteRule ^(.*)$ http://www.example.com/$1 [R=302,L]

Also, is there a %{CONSTANT} I can use in place of example.com that represents the current domain?

Upvotes: 1

Views: 145

Answers (1)

Michael Berkowski
Michael Berkowski

Reputation: 270637

The constant you're looking for is %{HTTP_HOST} as provided by the HTTP request. Perhaps you are looking for the variable %{SERVER_NAME} for the virtual host's default servername?

Place the hostname checking rule first, and use a RewriteCond in the page.php rule to only apply if the domain is already correct:

RewriteEngine On
# First rewrite the domain
RewriteCond %{HTTP_HOST} ^example\.com$
RewriteRule ^(.*)$ http://www.%{HTTP_HOST}/$1 [R=301,L]

# Then rewrite the files
# At this point, the domain should already have been enforced
RewriteCond %{HTTP_HOST} ^www\.example\.com$
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-l
RewriteRule (?!^(cms|images|js|mobile)(/.*|)$)^.*$ page.php [NC,L]

Upvotes: 1

Related Questions