-1

我不想在这里用大量 .htaccess 问题来夸大一篇文章,所以我将它们单独分解。这与使用RedirectMatch为现有网站的一部分的现有索引页面创建规则有关。

具体来说,我的测试站点已经运行了大约一年,现在我正在使用 .htaccess 重写干净的 URL 以获得更好的 SEO。因此,当我有一个容器页面,其内容基于链接中的查询字符串调用时,如下所示:

http://www.website.com/departments.php?dep=contact_us

我正在努力使 URL 看起来更流畅,例如:

http://www.website.com/contact-us/

我阅读的教程建议将我的链接更改为新的、更时髦的 SEO 友好样式会导致大量 404 错误和断开的页面链接,直到该站点再次被索引并且记录被更新。

因此,我的问题是:这是一个合理的担忧,还是会在 24-48 小时内获取新链接?

我问是因为我有几个具有多层文件结构的网站,并且我认为我的 .htaccess 文件中需要大量规则来修复我可能正在创建的所有损坏的链接。

如果我在这里制造混乱,请告诉我,我会澄清事情。

提前谢谢了!

4

1 回答 1

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 内部服务器错误(如果将第二条规则替换为 a ,也会发生同样的事情RedirectMatch)。要解决此问题,您需要创建一个条件,以便仅当实际请求是针对 "url-b"时才应用外部重定向(第二条规则)。您可以通过匹配%{THE_REQUEST}变量来做到这一点,该变量本质上是 HTTP 请求的第一行。

使用您的示例 URL,您将拥有如下内容:

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]

这意味着当像 google-bot 这样的人尝试解析http://www.website.com/departments.php?dep=contact_us时,第二条规则的条件将匹配请求(看起来像GET /departments.php?dep=contact_us HTTP/1.1:),并且它会被重定向到http://www.website.com/contact-us/. 此时,客户端(google-bot)将请求/contact-us/并应用第一条规则并将 URI 内部重写为/departments.php?dep=contact_us.

于 2013-04-09T01:15:18.090 回答