.htaccess重写规则生效后PHP无法访问$_GET变量的技术求助
解决.htaccess重写后PHP无法获取$_GET变量的问题
嘿,作为.htaccess新手遇到这个问题太正常了!我帮你拆解一下核心问题和解决方案:
为什么$_GET变量丢失了?
从你贴的配置来看,你只写了RewriteCond(重写条件),但缺少关键的RewriteRule(重写规则)——这就像只给了判断条件,却没说满足条件后要做什么。另外,就算有规则,如果没加正确的标志,也会导致原查询字符串被丢弃,$_GET自然拿不到值。
完整的配置示例(附解释)
我给你写一个通用的SEO友好重写配置,你可以根据自己的实际URL结构调整:
RewriteEngine On # 1. 排除实际存在的资源:避免重写真实的文件、目录、符号链接 RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-l # 2. 排除静态资源:防止CSS/JS/图片等被错误重写 RewriteCond %{REQUEST_URI} !\.css$ [NC] RewriteCond %{REQUEST_URI} !\.js$ [NC] RewriteCond %{REQUEST_URI} !\.(png|jpg|jpeg|gif)$ [NC] # 可以继续添加你需要的静态资源后缀 # 3. 具体重写规则(根据你的URL需求调整) # 示例1:把 /article/123 重写为 /article.php?id=123 RewriteRule ^article/(\d+)$ article.php?id=$1 [L,QSA] # 示例2:把 /category/web-dev 重写为 /category.php?slug=web-dev RewriteRule ^category/([a-z0-9-]+)$ category.php?slug=$1 [L,QSA,NC]
关键标志解释:
[L]:表示这是最后一条匹配的规则,匹配后不再处理后续规则,避免冲突[QSA]:重中之重!它会把原URL的查询字符串追加到重写后的URL里。比如用户访问/article/123?utm_source=google,重写后会变成article.php?id=123&utm_source=google,这样$_GET就能拿到所有参数了[NC]:不区分大小写,比如/Category/Web-Dev也能匹配到规则,提升兼容性
新手调试技巧
如果还是有问题,可以用这些方法排查:
- 在PHP页面里打印
<?php var_dump($_GET, $_SERVER['REQUEST_URI']); ?>,看看实际请求的URI和获取到的参数是什么 - 先只加一条简单的规则测试,确认能正常获取$_GET后,再逐步添加其他规则
- 确保你的PHP文件路径和规则里的路径一致(比如如果PHP在
/blog/article.php,规则要写成^blog/article/(\d+)$ blog/article.php?id=$1)
额外优化建议
- 尽量避免泛化的规则(比如
RewriteRule ^(.*)$ index.php),除非你是做单页应用需要手动解析URI,这种情况下$_GET不会自动填充,需要自己处理 - 规则的顺序很重要:更具体的规则要放在前面,泛化的规则放在后面
内容的提问来源于stack exchange,提问作者Paddy Hallihan
相关产品推荐
相关产品推荐

