我正在尝试将“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}的解决方案......但没有任何作用:/
希望你们能帮助我!我对此感到疯狂!
提前致谢!
答案 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,因此将浏览器重定向到干净版本。