views:

14

answers:

1

I'm having some trouble with my .htaccess redirections.

I want a situation in which the (non-www)domain.tld is redirected to the www.domain.tld. And I want to rewrite the arguments to skip the index.php, making a request for /foo go to index.php/foo.

Initial situation

First I had these rules

RewriteCond %{HTTP_HOST} ^domain\.tld [NC]
RewriteRule ^(.*)$ http://www.domain.tld/$1 [R=301]

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^([a-zA-Z0-9_\ /:-]*)$ index.php [L]

And this worked. Mostly. What didn't work was that in PHP $_SERVER['PATH_INFO'] stayed empty and I disliked the whitelisting of the characters.

Change for PATH_INFO and to accept more

So I changed the last line into this:

RewriteRule ^(.*)$ index.php/$1 [L]

This fixed the PATH_INFO and the limited characters. However, I recently noticed that this caused the non-www redirect to www. to fail miserably.. When going to the non-www domain Apache says

Moved Permanently
The document has moved here.

Where 'here' is linked to the same thing I typed (non-www domain.tld) and thus failing to serve the user.

Continuing the search..

I found a lot of Q&A here and elsewhere or the topic of non-www redirections, but all seem to fail in some way. For example:

RewriteCond %{HTTP_HOST} !^www.*$ [NC]
RewriteRule ^/.+www\/(.*)$ http://www.%{HTTP_HOST}/$1 [R=301]

This just didn't do that much. Nothing got redirected, although the website was served on the non-www.

Anyone knowing what I do wrong or having a solution for this mess? :)

(Preferably, I would like the non-www redirection to be global. So that I don't have to change the actual domain name every time.)

A: 

I guess you’re just missing the L flag to end the rewriting process:

RewriteCond %{HTTP_HOST} !^www\.
RewriteRule ^ http://www.%{HTTP_HOST}%{REQUEST_URI} [L,R=301]

And make sure to put this rule in front of those rules that just cause an internal rewrite.

Gumbo
Thanks, that was the problem indeed. I thought that the L flag marked the ending of processing the .htaccess, so no further lines would be used at all. But this seems more like 'first rewrite, then continue'.
Lode