如何 mod_rewrite 并保留查询字符串?
Posted
技术标签:
【中文标题】如何 mod_rewrite 并保留查询字符串?【英文标题】:How can I mod_rewrite and keep query strings? 【发布时间】:2012-10-04 02:23:27 【问题描述】:我想对另一个页面的 URL 进行 mod_rewrite,但我还希望保留添加的任何查询字符串。
RewriteEngine On
#enforce trailing slashes
RewriteCond %REQUEST_FILENAME !-f
RewriteCond %REQUEST_URI !#
RewriteCond %REQUEST_URI !(.*)/$
RewriteRule ^(.*)$ http://localhost/siteroot/$1/ [L,R=301]
RewriteRule ^apps/([A-Za-z0-9-_]+)/?$ index.php&app=$1
因此,如果用户访问apps/app1/
,则会显示index.php?app=app1
。
但是,我希望能够保留可选的查询字符串,以便访问apps/app1/?variable=x
返回index.php?app=app1&variable=x
。
什么 mod_rewrite 规则/条件会导致这种情况发生?
【问题讨论】:
【参考方案1】:您需要添加[QSA]
flag(“查询字符串追加”)
RewriteRule ^apps/([A-Za-z0-9-_]+)/?$ index.php&app=$1 [L,QSA]
对于带有[R]
标志的页面301 重定向,而不是像这样的内部重写,查询字符串会自动附加。但是,您必须使用[QSA]
强制它进行内部重写。
【讨论】:
谢谢,没想到这么简单。 +1 同意@DanielOakey.. 我试图用正则表达式破解一些东西,但它不起作用.. 澄清一下,这与重写与重定向无关。 httpd.apache.org/docs/current/rewrite/flags.html#flag_qsa 说:当替换 URI 包含查询字符串时,RewriteRule 的默认行为是丢弃现有的查询字符串,并用新生成的查询字符串替换它。使用 [QSA] 标志会合并查询字符串。 也许你们已经知道了,但请确保在QSA
之前不要留空。最终会出现 HTTP 500...以上是关于如何 mod_rewrite 并保留查询字符串?的主要内容,如果未能解决你的问题,请参考以下文章
mod_rewrite 删除 .php 扩展名并保留 GET 参数
为啥 ?XDEBUG_PROFILE=true 被 mod_rewrite 忽略?