mod_rewrite and double slash issue

2019-02-02 14:19发布

问题:

I applied the following mod_rewrite rule in Apache2 to redirect from non www to www:

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

I have two questions:

1) There's a double slash issue:

  • When I go to http://www.example.com it correctly rewrites the URL to http://www.example.com/
  • When I go to http://www.example.com/somepage, it correctly rewrites the URL to http://www.example.com/somepage
  • If I go to http://example.com, it rewrites the URL to http://www.example.com// (double final slash)
  • If I go to http://example.com/somepage, it correctly rewrites it to http://www.example.com/somepage

Any tips to fix it?

2) Is my configuration good for SEO?

回答1:

Fixed with:

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

because $1 by default contains the index path /



回答2:

RewriteRule ^\/?(.*)$ http://www.mydomain.com/$1 [R=301,L]


回答3:

Actually, you will always have double slashes due to

RewriteRule ^(.*)$ http://www.mydomain.com/$1 [R=301,L]

combined with the fact that REQUEST_URI (that you are matching on) normally contains a starting slash. What you can try is RewriteRule ^(.*)$ http://mydomain.com$1, and then send a broken HTTP request GET foo HTTP/1.0 and see if Apache deals with it properly.



回答4:

Putting a slash into your pattern should resolve this issue:

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


回答5:

That is because the root path is /, and you are appending whatever you get in RewriteRule (the first case works fine because it doesn't match the condition so no rewrite is performed).

You can try something like this:

RewriteEngine On
RewriteCond %{HTTP_HOST} ^mydomain\.com$ [NC]
# for the home page
RewriteRule ^/$ http://www.mydomain.com/ [R=301,L]
# for the rest of pages
RewriteRule ^(.*)$ http://www.mydomain.com/$1 [R=301,L]