1

我查看了堆栈溢出,但找不到我正在寻找的确切答案,所以就到这里。

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

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

4

1 回答 1

0

当有人http://holtplantandmachinery.co.uk/category.php?name=wheel-loaders在浏览器的 URL 地址栏中键入内容时,发送到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并且该 URL 将显示在浏览器的 URL 地址栏中。您使用%{THE_REQUEST}而不是的原因%{QUERY_STRING}是因为当您的其他规则将更好看的 URL 重写为带有查询字符串的 URL 时,它会看起来并且%{QUERY_STRING}匹配,该规则将被应用并导致重定向循环。或者,您可以匹配查询字符串并使用:

RewriteCond %{ENV:REDIRECT_STATUS} !200

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

然后你会有你的内部重写规则:

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^/?cat/(.*)$ /category.php?name=$1 [L]
于 2012-10-25T02:43:08.753 回答