我希望https://www.example.com/somePage.php?id=1234
被重定向到https://www.example.com/tool/1234
(以便旧链接和书签能够正常工作)。
我想我已经接近了,但这似乎不起作用......
RewriteRule ^somePage.php?toolid=([0-9]+)$ /tool/$1 [R=301,L]
这里有什么问题?
答案1
您无法匹配查询字符串RewriteRule
图案。您需要使用RewriteCond
指令并与QUERY_STRING
服务器变量进行比较。
但是,假设您稍后在配置文件中有一个内部重写,该重写会重写回(真实)丑陋的 URL,那么您无法进行简单的重定向,因为这会导致重定向循环。您需要确保仅重定向初始请求,而不是重写的 URL。
假设这是.htaccess
基于您现有的RewriteRule
图案,在配置文件顶部附近尝试以下内容:
RewriteCond %{ENV:REDIRECT_STATUS} ^$
RewriteCond %{QUERY_STRING} ^toolid=(/d+)$
RewriteRule ^somePage\.php$ /tool/%1 [R=301,L]
但请注意,您的示例 URL 与您的代码示例不同。我采用了您的代码示例。
环境REDIRECT_STATUS
变量在初始请求时为空,但在成功进行内部重写后被设置为“200”。因此,这避免了每个目录文件中的重定向循环.htaccess
。
确保您已清除浏览器缓存,因为任何错误的 301(测试时)都会被浏览器缓存。