mod_rewrite被忽略了

时间:2011-11-01 22:21:03

标签: mod-rewrite query-string

我正在尝试将“domain.com/index.php?site=food&category=beef”转换为“domain.com/food/beef”,但无论我尝试什么,它都无效。它总是离开原始域,我没有错误。

我认为这是我的错,我在3个不同的服务器(以及3个不同的项目)上为3个不同的URL尝试了这个... ...看起来好像我不知道mod_rewrite是如何工作的,尽管我阅读了关于这个的所有文档我找到的主题。我甚至在SO上花了几天没有找到任何解决方案。

服务器上启用了Mod_rewrite:

RewriteEngine On
RewriteRule ^  http://www.google.com [R,L]

给了我“http://www.google.com/?site=food&category=beef”。看起来mod_rewrite无法识别查询字符串...所以我尝试了几个使用RewriteCond%{QUERY_STRING}的解决方案......但没有任何作用:/

希望你们能帮助我!我对此感到疯狂!

提前致谢!

2 个答案:

答案 0 :(得分:1)

尝试:

RewriteEngine on
RewriteRule ^food/beef$ index.php?site=food&category=beef [L]

或更一般地说:

RewriteEngine on
RewriteRule ^([a-zA-Z0-9_-]+)/([a-zA-Z0-9_-]+)$ index.php?site=$1&category=$2 [L]

答案 1 :(得分:0)

你想做这样的事吗?

RewriteRule ^([^/]+)/([^/]+)/? /index.php?site=$1&category=$2 [L]

当你转到http://domain.com/food/beef时,会在内部将请求重写为“/index.php?site=food&category=beef”,而index.php用于提供原始请求。浏览器的位置栏仍然会显示“http://domain.com/food/beef”。

如果您希望位置栏说出http://domain.com/index.php?site=food&category=beef,请在“[L]”中添加“R”。如果这是倒退的,当有人在位置栏中输入http://domain.com/index.php?site=food&category=beef并且请求在服务器内部被重写为“/ food / beef”时你需要它,那么你需要使用RewriteCond解析出查询字符串:

RewriteCond %{QUERY_STRING} ^site=([^&]+)&category=([^&]+)
RewriteRule ^index.php /%1/%2? [L]

同样的事情适用于导致浏览器重定向的“R”,就像第一个例子一样。如果您希望位置栏更改为http://domain.com/food/beef,则括号应如下所示:[L,R]。请注意,您需要在规则的目标末尾添加,以便不会抛出查询字符串。这就是为什么在您的Google示例中,会追加查询字符串。

编辑:

看来你只是想改变浏览器位置栏中的内容而不是内容的位置:

您需要重新重写上面的第二条规则已将 BACK 重写为index.php,但没有重定向。为了防止2个规则无限循环,因为一条规则重写为另一条规则,反之亦然,你需要在某处添加一个标记,以防止上面的第二条规则反复重定向。

结合这两者,你会得到这个:

RewriteRule ^([^/]+)/([^/]+)/? /index.php?site=$1&category=$2&redirected [L]

RewriteCond %{QUERY_STRING} !redirected
RewriteCond %{QUERY_STRING} ^site=([^&]+)&category=([^&]+)
RewriteRule ^index.php /%1/%2? [L,R=301]

请注意查询字符串中的redirected参数。当有人试图访问网址的干净版本时插入,例如“/食品/牛肉”。在内部,它被重新路由到index.php,但由于规则没有“R”,浏览器的位置栏不会改变。

第二个规则现在检查请求是否在查询字符串中包含redirected param。如果没有,这意味着有人在浏览器的位置栏中输入了index.php url,因此将浏览器重定向到干净版本。