要从网址中删除index.html
或index.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]
这也有效!
这里的问题是如何避免上述规则创建的双重定向,如下所示:
http://mydomain.com/path/index.html
301
标头发送到redircet浏览器http://mydomain.com/path/
http://mydomain.com/path/
301
标头发送到redircet浏览器http://www.mydomain.com/path/
这显然不是很聪明,因为要求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=babe
来
http://.../?hello=babe
答案 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?
; 所有规则的单一重定向。