我知道有些事情存在冲突,但作为一个mod重写Muggle是时候寻求帮助了。
我正在重写http://test.com/[name]/
到http://test.com/script.php?id=[name]
成功,使用:
(rule#1)
RewriteRule ^(.*)\/$ script.php?id=$1&%{QUERY_STRING} [L]
接下来,我重写http://test.com/[name]/foobar/[key]
到http://test.com/script.php?id=[name]&foobar=[key]
也取得了成功,使用:
(rule#2)
RewriteRule ^(.*)\/foobar/([0-9]+)$ script.php?id=$1&foobar=$2 [L]
但是,当我尝试包含查询字符串时,
所以http://test.com/[name]/foobar/[key]?p=[page]
可以重写为http://test.com/script.php?id=[name]&foobar=[key]&p=[page]
有了这个:
(rule#3)
RewriteRule ^(.*)\/foobar/([0-9]+)$ script.php?id=$1&foobar=$2&%{QUERY_STRING} [L]
然后Apache就把我扔回http://test.com/script.php。
我从试验中得知,如果规则#3没有像规则#1那样使用相同的script.php,则规则#3会起作用
但是我不知道如何解决它,所以任何帮助都会受到赞赏!
Arrgh ......在用Gumbo的例子仔细检查我的规则后,我终于发现了什么问题。虽然不完美,但我的重写规则实际上是按预期工作的。但是我完全忘记了我有另一个脚本来检查有效参数......显然,抛出随机测试值,有时候不是一个好主意。谢谢^ /技巧!
答案 0 :(得分:2)
使用[^/]+
仅匹配除/
之外的一个或多个任意字符,而不是.*
任意数量的任意字符:
RewriteRule ^([^/]+)/$ script.php?id=$1&%{QUERY_STRING} [L]
RewriteRule ^([^/]+)/foobar/([0-9]+)$ script.php?id=$1&foobar=$2 [L]
此外,您可以设置 QSA 标志,使原始请求的查询自动附加到新网址,而不是手动附加:
RewriteRule ^([^/]+)/$ script.php?id=$1 [L,QSA]
答案 1 :(得分:0)
警告:您使用的是.*
,实际上无法匹配。使用.+
,除非您打算不与任何内容匹配。
这里列出了所有规则吗?你的error_log中有关于此的错误吗?