HTaccess静态重写的动态URL,无需循环即可双向工作

时间:2012-10-24 12:16:06

标签: .htaccess

我已经查看了堆栈溢出,无法找到我正在寻找的确切答案,所以这里就是。

我有一个网址 http://holtplantandmachinery.co.uk/cat/wheel-loaders重定向到http://holtplantandmachinery.co.uk/category.php?name=wheel-loaders

但是当我输入动态URL时,我需要它以相反的方式工作,它会重写为上面的静态(文件夹查找)URL,反之亦然。基本上无论调用什么,它都应该重写为静态的。现在我知道我需要设置一个与上面的方法相反的重写,然后有一个条件来阻止无限循环,但我似乎无法得到任何工作,请帮助。

1 个答案:

答案 0 :(得分:0)

当有人在浏览器的URL地址栏中输入http://holtplantandmachinery.co.uk/category.php?name=wheel-loaders时,发送到 holtplantandmachinery.co.uk 服务器的请求类似于:

GET /category.php?name=wheel-loaders HTTP/1.1
Host: holtplantandmachinery
some other headers
etc 

您可以使用%{THE_REQUEST} var来匹配第一行:

RewriteCond %{THE_REQUEST} ^(GET|POST|HEAD)\ category\.php\?name=([^&\ ]+)
RewriteRule ^ /cat/%2? [L,R=301]

这会将请求重定向到http://holtplantandmachinery.co.uk/cat/wheel-loaders,该网址会显示在浏览器的网址栏中。您使用%{THE_REQUEST}而不是%{QUERY_STRING}的原因是因为当您的其他规则将具有查询字符串的更好看的网址重写时,它看起来会%{QUERY_STRING}匹配,规则将被应用并导致重定向循环。或者,您可以匹配查询字符串并使用:

RewriteCond %{ENV:REDIRECT_STATUS} !200

确保URI不是来自之前重写的内部重定向。

然后你就有了内部重写规则:

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^/?cat/(.*)$ /category.php?name=$1 [L]