已解决:自定义添加URL重写规则与获取GET字符串问题
解决Clean URLs配置下无法获取GET参数的问题
我之前在做SEO优化、配置简洁URL(clean URLs)的时候,也踩过完全一样的坑——页面能正常加载,但就是拿不到GET请求的参数,原来的代码看着能跑,但其实藏着逻辑错误。折腾了一阵调整代码后,终于完美解决了这个问题,分享下我的处理过程:
问题场景
当我们把动态URL(比如/product?id=123)改成更友好的clean URL(比如/product/123)后,发现通过$_GET['id'](以PHP为例)根本获取不到参数值,甚至$_GET数组是空的,但页面本身没有报错,这就是典型的URL重写后参数传递的问题。
原有错误代码示例(以Apache的.htaccess为例)
原来的重写规则可能是这样的,看起来能把URL转成动态路径,但其实没处理参数传递:
RewriteEngine On RewriteRule ^product/([0-9]+)$ product.php [L]
这个规则确实能把/product/123指向product.php,但它没有把捕获到的123传递成GET参数,也没保留原本可能存在的其他GET参数(比如/product/123?utm_source=blog这类带追踪参数的情况)。
调整后的正确代码
修改重写规则,加上QSA(Query String Append)标志,并且把捕获的参数传递给处理脚本:
RewriteEngine On RewriteRule ^product/([0-9]+)$ product.php?id=$1 [QSA,L]
$1对应正则里捕获的([0-9]+),也就是我们要的ID值,这样product.php里就能通过$_GET['id']拿到123了QSA标志的作用是保留原本URL里的其他查询参数,比如用户访问/product/123?utm_source=blog,重写后会变成product.php?id=123&utm_source=blog,所有参数都能正常获取
如果是Nginx环境,对应的配置调整也类似,把重写规则改成:
location /product { rewrite ^/product/([0-9]+)$ /product.php?id=$1 last; }
同样要确保参数被正确传递到处理脚本里。
验证方法
调整完配置后,重启Web服务器,然后:
- 访问
/product/456,在product.php里用var_dump($_GET)查看,应该能看到array(1) { ["id"]=> string(3) "456" } - 访问
/product/456?test=abc,应该能看到array(2) { ["id"]=> string(3) "456" ["test"]=> string(3) "abc" },说明QSA生效了
这样调整后,既实现了SEO友好的clean URLs,又能正常获取所有GET参数,完美解决了之前的问题!
内容的提问来源于stack exchange,提问作者Guillermo Caballero
相关产品推荐
相关产品推荐

