缺少GET请求变量有时是web服务器配置文件中不正确重写规则的症状。对于Apache,重写通常使用mod_rewrite
WordPress安装目录级别中的模块指令.htaccess
配置文件-但是,更高级别的配置文件(目录、vhost、主配置等)中也可能存在错误的重写规则。
默认情况下,WordPress会将除现有文件和目录之外的所有请求路由到index.php
使用类似以下的配置:
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteRule ^index\\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>
有两种修改会导致这些指令在重写请求的过程中删除querystring:
在discard querystring flag. 这将添加到RewriteRule
指令作为QSD
或qsdiscard
. 如果此标志存在于RewriteRule
在上面的配置中,几乎每个由WordPress处理的请求都会丢弃查询字符串。例如:
RewriteRule ^index\\.php$ - [L,QSD]
任何使用
?
在a中
RewriteRule
指令的替换字符串(不带
append querystring flag). 指定任何查询字符串(即使是单个
?
如果没有任何后续键/值对),则替换将导致重写完全替换原始查询字符串。例如:
RewriteRule . /index.php? [L]
或
RewriteRule . /index.php?foo=bar [L]
如果希望在每次重写时都附加一个自定义GET变量,则可以在括号中指定append querystring标志,如下所示
QSA
或
qsappend
要将替换中的查询字符串与原始查询字符串合并,而不是完全覆盖它,请执行以下操作:
RewriteRule . /index.php?foo=bar [L,QSA]