如何 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 参数

如何从 mod_rewrited url 查询字符串中获取

为啥 ?XDEBUG_PROFILE=true 被 mod_rewrite 忽略?

如何调试 mod_rewrite 规则?

如何根据查询字符串在 apache mod_rewrite 中禁止 url?

Mod_rewriting 将查询字符串写入 swf 文件