如何调整.htaccess的Rewrite规则隐藏.php后缀及GET查询参数
解决方案
方案1:URL完全无参数(仅显示/setup)
该方案通过cookie临时存储参数实现需求,.htaccess完整配置如下:
RewriteEngine on # 匹配带id参数的setup请求,重定向到无参数版本,同时将id写入cookie RewriteCond %{QUERY_STRING} ^id=(\d+)$ RewriteRule ^setup$ /setup [R=302,L,CO=id:%1:%{HTTP_HOST}:/] # 原有隐藏.php扩展名的配置 RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{REQUEST_FILENAME}\.php -f RewriteRule ^(.*)$ $1.php [NC,L]
修改setup.php的参数读取逻辑:
// 替换原有 $_GET['id'] 读取逻辑 $id = $_GET['id'] ?? $_COOKIE['id'] ?? null; // 自行补充id合法性校验逻辑
注意
- 单用户同一时间只能保留一个有效id参数,同时打开多个不同id的setup页面会出现参数覆盖问题
- 测试阶段使用302临时重定向,确认功能正常后可改为301永久重定向提升SEO效果
方案2:伪静态路径(无查询串,URL格式为/setup/123)
如果可以接受路径中携带id值,这是无参数冲突的通用稳定方案,.htaccess完整配置如下:
RewriteEngine on # 匹配setup的伪静态路径,内部重写为带参数的php请求 RewriteRule ^setup/(\d+)$ setup.php?id=$1 [NC,L] # 原有隐藏.php扩展名的配置 RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{REQUEST_FILENAME}\.php -f RewriteRule ^(.*)$ $1.php [NC,L]
同步修改index页的跳转链接为setup/123格式即可,setup.php仍可直接通过$_GET['id']读取参数,无需额外调整。
方案3:POST提交(完全无参数暴露)
如果不需要支持用户收藏setup页面的直达链接,最安全的实现方式是改用POST表单提交跳转:
<!-- index页跳转代码替换为以下内容 --> <form action="setup" method="post" id="goSetup"> <input type="hidden" name="id" value="123"> </form> <script>document.getElementById('goSetup').submit()</script>
setup.php改为通过$_POST['id']读取参数即可,URL全程不会出现任何参数信息。
内容的提问来源于stack exchange,提问作者trinula
相关产品推荐
相关产品推荐

