我有这样的规则:
RewriteEngine On
RewriteRule ^/page/([a-zA-Z0-9]+)\?(.*)$ /index.php?page=$1&$2
它应该采取如下方式:
/page/contact?cake=lie
并转到页面:
/index.php?page=contact&cake=lie
我已经使用 RegExr 和 RegexPal 等工具对此进行了测试,并且它在那里可以正常工作。但是当将其放入 Apaches 配置中时,访问该 URL 会出现 Apaches 404 页面。
有人可以帮忙吗?
答案1
如果你想逐字传递现有的查询字符串,mod_rewrite 提供了QSA
旗帜为此目的。使用它,您的规则集可以简化为以下内容:
RewriteEngine On
RewriteRule ^/page/([a-zA-Z0-9]+)$ /index.php?page=$1 [QSA]
然后,mod_rewrite 会自动将任何现有的查询字符串附加到您通过替换添加的查询字符串后面。结果实际上与Steven Monai 的方法,但我觉得这种方法更干净一些。
答案2
默认情况下,mod_write 与 REQUEST_URI 匹配,它仅包含 URI 而不包含动态参数,因此它将丢弃问号后的所有内容。
要匹配完整 URI,您需要改用 THE_REQUEST(或者如果有其他方法,请告诉我!)。请注意,它包含客户端发送的完整请求,例如“GET /foo?bar=baz HTTP/1.1”。
尝试类似
RewriteCond %{THE_REQUEST} ^(.*)$
RewriteRule ^GET /page/([a-zA-Z0-9]+)\?(.*) HTTP.*$ /index.php?page=$1&$2
答案3
您是否打开了重写引擎?
RewriteEngine On
答案4
Janne 对你的规则不起作用的原因的评估是正确的。但我会采取一种不太复杂的方法来解决它:
RewriteRule ^/page/([a-zA-Z0-9]+)$ /index.php?page=$1&%{QUERY_STRING}
当 Apache 已经在 中向您提供查询字符串时,您无需拆分原始请求来获取查询字符串%{QUERY_STRING}
。
通过语法可用的服务器变量列表%{VARNAME}
是记录在这里。