【发布时间】:2019-02-17 20:38:55
【问题描述】:
我正在制定一个重写规则,将art/slug/... 重写为art/.../?art=slug。我编写的规则有效,但仅在使用 [QSA] 时生成预期的查询字符串。
规则正上方是RewriteCond %{REQUEST_FILENAME} !-f,以防止一旦重写的url与现有文件匹配时循环。
我已经测试了以下规则,并导航到art/test/,其中$_GET 是var_dump'd。结果如下:
RewriteRule ^art/([^/]*)/?(.*) art/$2?art=$1 [L] 输出'art' => string ''RewriteRule ^art/([^/]*)/?(.*) art/$2?art=$1 [QSA,L] 输出'art' => string 'test'RewriteRule ^art/([^/]*)/?(.*) art/$2?art=test [L] 输出'art' => string 'test'
据我了解,QSA 旨在将“原始”查询字符串附加到“重写”查询字符串。
在我的情况下,我在原始网址中没有也不想要任何查询字符串;它完全是在重写期间完成的,所以在第一个示例中,我不明白为什么我的 art 键设置为空(尽管它不是未定义的)。
假设我误解了QSA,并且它是生成任何查询字符串所必需的;那么在第三个示例中,如何在没有 QSA 标志的情况下对查询字符串的值进行硬编码?
删除 QSA 会以某种方式改变我的正则表达式的工作方式吗?
我正在使用 WAMP 3.0.6 64 位、Apache 2.4.23 和 PHP 7.0.10 运行本地服务器
【问题讨论】:
-
我不明白。需要详细说明吗?不是/之后的捕获组?最终是空的,它是在那之前的捕获组。 QSA 如何发挥作用?
-
提供有关您使用上述规则测试的所有 URL 的更多信息
-
我确实写了两对括号,不是吗?使用示例 3,$2 绝对不是空的:导航到
art/test/edit.php确实让我登陆art/edit.php?art=test。 -
对不起我混了
-
我在测试更多网址时确实发现了一些可疑的东西。我将用更多示例编辑我的帖子。
标签: regex .htaccess mod-rewrite url-rewriting query-string