WAMP环境RewriteRule含斜杠时$_GET为空,用连字符正常求助
这问题我之前帮不少开发者排查过,核心原因大概率是Apache的MultiViews功能或者你本地项目里刚好存在index目录导致的,咱们一步步拆解清楚:
为什么连字符版本能正常工作?
当你访问index-test123时,这个路径既不是现有文件也不是目录,Apache找不到对应的资源,就会直接交给你的RewriteRule处理,规则里的正则^index-([a-z0-9]+)$能精准捕获到test123,自然能把值传给$_GET["test"]。
斜杠版本失效的两大常见原因
1. 项目根目录存在index文件夹
如果你的WAMP项目根目录下刚好有个名为index的目录,Apache会优先把index/test123识别为目录请求,直接尝试访问这个目录(甚至可能自动给URL加后缀/),完全跳过了你写的Rewrite规则,自然拿不到test参数。
2. Apache的MultiViews功能自动匹配文件
MultiViews是Apache mod_negotiation模块的默认功能之一,当你请求index/test123时,它会自动尝试匹配根目录下的index.php文件,直接把请求解析到index.php,但不会传递你期望的test参数,导致$_GET["test"]为空。
针对性解决方案
方案1:关闭MultiViews(最常用)
直接在你的.htaccess开头加上关闭MultiViews的配置,强制Apache走你定义的Rewrite规则:
Options +FollowSymlinks -MultiViews RewriteEngine on RewriteRule ^index/([a-z0-9]+)$ index.php?test=$1 [QSA,L]
方案2:排除真实存在的目录(如果有index目录)
如果你确实需要保留index目录,就在规则前加一个条件,排除真实存在的目录请求:
Options +FollowSymlinks RewriteEngine on # 跳过真实存在的目录 RewriteCond %{REQUEST_FILENAME} !-d RewriteRule ^index/([a-z0-9]+)$ index.php?test=$1 [QSA,L]
方案3:用END flag替代L flag(Apache 2.4+)
如果你的Apache版本是2.4及以上,可以用END替代L,防止后续可能存在的规则干扰当前匹配:
RewriteRule ^index/([a-z0-9]+)$ index.php?test=$1 [QSA,END]
验证方法
先检查项目根目录有没有index文件夹,然后应用上面的方案,重新访问index/test123,此时$_GET["test"]应该就能正确获取到test123了。
内容的提问来源于stack exchange,提问作者KD974

