我希望将https://www.example.com/somePage.php?id=1234
redirect到https://www.example.com/tool/1234
(以便传统链接和书签工作)。
我觉得我很接近,但这似乎不起作用…
RewriteRule ^somePage.php?toolid=([0-9]+)$ /tool/$1 [R=301,L]
这里有什么问题?
您无法匹配RewriteRule
模式中的查询string。 您需要使用RewriteCond
指令并与QUERY_STRING
服务器variables进行比较。
但是,假设你稍后在你的configuration文件中重写了(真实)丑陋的URL,那么你不能做一个简单的redirect,因为它会导致redirect循环。 您需要确保只redirect初始请求,而不是重写的URL。
假设这是基于你现有的RewriteRule
模式的 .htaccess
,请在configuration文件的顶部附近进行以下操作:
RewriteCond %{ENV:REDIRECT_STATUS} ^$ RewriteCond %{QUERY_STRING} ^toolid=(/d+)$ RewriteRule ^somePage\.php$ /tool/%1 [R=301,L]
但是,请注意,您的示例url与您的代码示例不同。 我已经走了你的代码示例。
初始请求中的REDIRECT_STATUS
环境variables是空的,但是在内部重写成功后设置为“200”。 所以,这避免了每个目录.htaccess
文件中的redirect循环。
确保你已经清除了你的浏览器caching,因为任何错误的301(即testing)都将被浏览器caching。