我不想在这里用一大堆.htaccess问题臃肿一个帖子,所以我将它们单独分解。这与使用RedirectMatch
为现有网站的现有索引页面创建规则有关。
具体来说,我的测试网站已经运行了大约一年,我现在正在使用.htaccess重新编写干净的URL以获得更好的SEO。所以,当我有一个容器页面,其内容是根据链接中的查询字符串调用的,如下所示:
http://www.website.com/departments.php?dep=contact_us
我正在努力让网址看起来更流畅,如:
http://www.website.com/contact-us/
我读过的教程建议将我的链接更改为新的,更加流畅的SEO友好风格会导致大量404错误和页面链接断开,直到该网站再次被编入索引并且记录更新。
因此,我的问题是:这是一个合理的问题还是新的链接会在24-48小时内被接收?
我问,因为我有几个网站,文件结构层次很多,我想我的.htaccess文件中需要一些TON规则来修复我可能正在创建的所有断开的链接。
如果我在这里制造混乱,请告诉我,我会澄清事情。
非常感谢提前!
答案 0 :(得分:2)
因此,我的问题是:这是一个合理的问题还是新的链接会在24-48小时内被接收?
如果您使用301(永久性)从外部重定向客户端,则可以更快地实现。这比在服务器端内部重写要困难得多,因为你会导致规则冲突。例如,如果您想在服务器内部将url-a重写为url-b,则将浏览器从url-b重定向到url-a(意味着当客户端专门请求url-b将其重定向到url-a时) :
# internally rewrite url-a (fake URL) to url-b (where the actual content is)
RewriteRule ^url-a$ /url-b [L]
# externally redirect url-b (actual content) to url-a (fake URL)
RewriteRule ^url-b$ /url-a [L,R=301]
由于重写引擎循环,这两个规则将继续相互重写并导致500内部服务器错误(如果用RedirectMatch
替换第二个规则,则会发生同样的情况)。要解决此问题,您需要创建一个条件,以便仅当实际请求是针对“url-b”时才会应用外部重定向(第二个规则)。您可以通过匹配%{THE_REQUEST}
变量来完成此操作,该变量本质上是HTTP请求的第一行。
使用您的示例网址,您将拥有以下内容:
RewriteRule ^contact-us/?$ /departments.php?dep=contact_us [L]
RewriteCond %{THE_REQUEST} ^(GET|HEAD)\ /departments\.php\?dep=contact_us
RewriteRule ^ /contact-us/ [L,R=301]
这意味着当像谷歌机器人这样的人尝试解析http://www.website.com/departments.php?dep=contact_us
时,第二条规则的条件将与请求匹配(看起来类似于:GET /departments.php?dep=contact_us HTTP/1.1
),它将被重定向到{{ 1}}。此时,客户端(google-bot)将请求http://www.website.com/contact-us/
,第一条规则将被应用,并在内部将URI重写为/contact-us/
。