从网址中删除'index.html'并在一个301重定向中添加'www'

时间:2011-05-19 14:04:23

标签: apache .htaccess mod-rewrite redirect url-rewriting

要从网址中删除index.htmlindex.htm,请在.htaccess

中使用以下内容
RewriteCond %{REQUEST_URI} /index\.html?$ [NC]
RewriteRule ^(.*)index\.html?$ "/$1" [NC,R=301,NE,L]

这有效!(有关此问题末尾的标记的更多信息*)

然后,为了在网址中添加www,我在.htaccess

中使用以下内容
RewriteCond %{HTTP_HOST} !^www\.mydomain\.com$ [NC]
RewriteRule ^(.*)$ "http://www.mydomain.com/$1" [R=301,NE,L]

这也有效!

这里的问题是如何避免上述规则创建的双重定向,如下所示:

  1. 浏览器要求http://mydomain.com/path/index.html
  2. 服务器将301 标头发送到redircet浏览器http://mydomain.com/path/
  3. 然后浏览器请求http://mydomain.com/path/
  4. 现在服务器将301 标头发送到redircet浏览器http://www.mydomain.com/path/
  5. 这显然不是很聪明,因为要求http://mydomain.com/path/index.html的穷人会被双重重定向,并且他觉得页面太慢了。此外,Googlebot可能会停止跟踪链接原因导致双重redircetion(我不确定最后一个,我不想讨论这个,这只是另一个可能的问题。)

    谢谢!


    *可能感兴趣的人:

    • NC也用于重定向 大写文件,即INDEX.HTML / InDeX.HtM
    • NE被使用 避免使用双url编码 http://.../index.html?hello=ba%20be 被重定向到 http://.../index.html?hello=ba%2520be
    • QSA用于重定向 也查询,即 http://.../index.html?hello=babehttp://.../?hello=babe (不需要感谢anubhava answer

3 个答案:

答案 0 :(得分:6)

为避免双重定向,.htaccess文件中的另一条规则符合以下两个条件:

Options +FollowSymlinks -MultiViews
RewriteEngine on

RewriteCond %{HTTP_HOST} !^www\. [NC]
RewriteCond %{REQUEST_URI} ^(.*/)index\.html$ [NC]
RewriteRule . http://www.%{HTTP_HOST}%1 [R=301,NE,L]

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

RewriteCond %{REQUEST_URI} ^(.*/)index\.html$ [NC]
RewriteRule . %1 [R=301,NE,L]

因此,如果输入网址为http://mydomain.com/path/index.html,则此处的第一个规则中的条件都会得到满足,并且会有1个单一重定向(301)到http://www.mydomain.com/path/

另外我认为上面并不真正需要QSA标志,因为你 NOT 操纵查询字符串。

答案 1 :(得分:2)

更好的解决方案是将index.html规则放在www规则之前,并在index.html规则中添加www前缀到目标网址。这样,寻找http://domain.com/index.html的人就会被FIRST规则发送到http://www.domain.com/。第二个(www)规则只适用于索引AND www丢失,这也只是一个重定向。

答案 2 :(得分:-1)

从先前规则中删除L标志? L forces the rule parsing to stop(当规则匹配时),因此发送第一个重写的URL而不应用第二个规则。

规则从上到下依次应用,如果匹配规则的条件和模式,则每次重写URL

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

RewriteRule ^(.*/)index\.html?$ $1 [NC,QSA,R=301,NE,L]

因此,上述内容将首先添加www,然后在发送新网址之前删除index.html?; 所有规则的单一重定向。