正则表达式捕获组为空,除非我使用[QSA]标志

时间:2019-02-17 20:38:55

标签: regex .htaccess mod-rewrite url-rewriting query-string

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

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

我已经测试了以下规则,并导航至art/test/所在的$_GET。结果如下:

var_dump输出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是否会以某种方式改变我的正则表达式的工作方式?


我正在使用64位WAMP 3.0.6,Apache 2.4.23和PHP 7.0.10运行本地服务器

1 个答案:

答案 0 :(得分:2)

我了解您的问题,您应该避免在上述所有情况下都发生循环,因此在重写之前,请确保没有query string,否则所有循环都会发生,以及为什么会错过第一行中的test

在任何规则之前添加它,然后再次测试:

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