【问题标题】:Regex capture group is empty, unless I use the [QSA] flag正则表达式捕获组为空,除非我使用 [QSA] 标志
【发布时间】:2019-02-17 20:38:55
【问题描述】:

我正在制定一个重写规则,将art/slug/... 重写为art/.../?art=slug。我编写的规则有效,但仅在使用 [QSA] 时生成预期的查询字符串。

规则正上方是RewriteCond %{REQUEST_FILENAME} !-f,以防止一旦重写的url与现有文件匹配时循环。

我已经测试了以下规则,并导航到art/test/,其中$_GETvar_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


【解决方案1】:

我理解你的问题,你应该防止在你上面提到的所有情况下发生循环,所以在重写之前你应该确保没有query string,否则循环会在所有情况下发生,这就是你错过@987654322的原因@ 在第一行。

在任何规则之前添加它并再次测试:

RewriteCond %{QUERY_STRING} !^(.+)$

【讨论】:

  • 循环将是我的死。我以为我是用自己的 RewriteCond 来阻止它,但看起来我错了。
猜你喜欢
  • 2018-09-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-06-21
  • 2014-08-17
  • 2019-01-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多