我有 :
RewriteRule ^Article/([^/]*)$ /article.php?newsid=$1 [L]
这意味着 URL 必须是//example.com/Article/855563
但 Google 会抓取//example.com/article.php?newsid=855563
。我能做些什么来防止这种情况发生?或者将 301 重定向到example.com/Article/855563
?
答案1
首先,您需要确定 Google 抓取错误 URL 的原因。
您是否更改了现有的 URL 结构(已被搜索引擎编入索引并链接到外部)?在这种情况下,您需要实施从旧 URL 到新 URL 的重定向,以保留 SEO 并让搜索引擎在 SERP 中替换旧 URL。
您是否在无意中在内部链接到错误的 URL,并向搜索引擎公开“错误的”URL?如果是这样,这些必须被修复前实施重定向。
否则,Google 就不应该能够发现“错误”的 URL。
您还应该rel="canonical"
在页面头部实现一个标签,以便向搜索引擎指示正确的规范 URL。
为了将 URL 从外部重定向/article.php?newsid=<newsid>
到/Article/<newsid>
(规范 URL) - 现有 URL 的反向内部重写- 然后您可以在文件顶部附近执行类似以下的操作.htaccess
(前现有的重写):
RewriteEngine On
RewriteCond %{ENV:REDIRECT_STATUS} ^$
RewriteCond %{QUERY_STRING} ^newsid=([^&]*)
RewriteRule ^article\.php$ /Article/%1 [R=302,L]
REDIRECT_STATUS
为了防止重定向循环,检查环境变量的第一个条件是必要的 - 它确保规则仅在来自客户端的直接请求上处理,而不是重写的请求(您现有的指令)。
第二个条件捕获 URL 参数的值newsid
(出现在 URL 路径的开头)。该值保存在%1
反向引用中(稍后在RewriteRule
代换)。请注意,这将捕获任何事物(如您重写的那样),但是,如果newsid
值始终是数字,那么这应该更加严格。例如^newsid=(\d+)
(仅 1 位或多位数字)。
请注意,目前这是 302(临时)重定向。只有确认其正常工作后才可将其更改为 301(永久)重定向 - 以避免任何缓存问题。