繁体   English   中英

从 url 中删除“index.html”并通过一个 301 重定向添加“www”

[英]Removing 'index.html' from url and adding 'www' with one single 301 redirect

为了从网址中删除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标头发送到重定向浏览器到http://mydomain.com/path/
  3. 然后浏览器请求http://mydomain.com/path/
  4. 现在服务器将301标头发送到重定向浏览器到http://www.mydomain.com/path/

这显然不是很聪明,因为询问http://mydomain.com/path/index.html的可怜用户会被双重重定向,他会觉得页面速度太慢。 此外,Googlebot 可能会停止关注导致双重重定向的链接原因(我不确定最后一个,我不想讨论这个问题,这只是另一个可能的问题。)

谢谢!


*可能对谁感兴趣:

  • 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

为了避免双重重定向,在 .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]

因此,如果输入 URL 是http://mydomain.com/path/index.html那么这里的第一条规则中的两个条件都得到满足,并且将有 1 个重定向 (301) 到http://www.mydomain.com/path/

此外,我相信上面并不真正需要QSA标志,因为您没有操纵查询字符串。

更好的解决方案是将 index.html 规则放在 www 规则之前,并在 index.html 规则中将 www 前缀添加到目标 URL。 这样,查找http://domain.com/index.html 的人会被 FIRST 规则发送到http://www.domain.com/ 第二个 (www) 规则仅在缺少索引和 www 时才适用,这也只是一个重定向。

从先前的规则中删除L标志? L强制规则解析停止(当规则匹配时),从而发送第一个重写的 URL,而不应用第二个规则。

规则从上到下依次应用,如果 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? , 在发送新 URL 之前; 所有规则的单一重定向。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM