我正在制定一个重写规则,将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运行本地服务器
答案 0 :(得分:2)
我了解您的问题,您应该避免在上述所有情况下都发生循环,因此在重写之前,请确保没有query string
,否则所有循环都会发生,以及为什么会错过第一行中的test
。
在任何规则之前添加它,然后再次测试:
RewriteCond %{QUERY_STRING} !^(.+)$