重写规则以重新编写旧的到漂亮的URL

我希望将https://www.example.com/somePage.php?id=1234redirect到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。