【问题标题】:How can I mod_rewrite and keep query strings?如何 mod_rewrite 并保留查询字符串?
【发布时间】: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 规则/条件会导致这种情况发生?

【问题讨论】:

    标签: apache .htaccess mod-rewrite query-string


    【解决方案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...
    猜你喜欢
    • 2018-05-11
    • 2023-03-22
    • 1970-01-01
    • 2011-05-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-21
    • 1970-01-01
    相关资源
    最近更新 更多