如何通过.htaccess让所有PHP脚本交由index.php处理并隐藏GET参数
用.htaccess隐藏PHP调用中的r GET参数
前提准备
首先得确保你的Apache服务器已经开启了mod_rewrite模块——打开Apache的配置文件(比如httpd.conf或apache2.conf),找到LoadModule rewrite_module modules/mod_rewrite.so这一行,确保它没有被注释掉,然后重启Apache生效。
基础实现(保留.php后缀)
如果想把index.php?r=something.php转换成/something.php这种URL,直接在网站根目录创建或编辑.htaccess文件,写入以下规则:
RewriteEngine On # 跳过实际存在的文件和目录,防止静态资源(比如图片、CSS)被错误重写 RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d # 将请求的PHP文件路径作为r参数转发到index.php RewriteRule ^(.+\.php)$ index.php?r=$1 [L,QSA]
[L]:表示这是最后一条匹配规则,匹配到后不再执行后续规则[QSA]:保留原URL中的其他GET参数,比如访问/something.php?foo=bar时,会自动转为index.php?r=something.php&foo=bar
进阶优化(去掉.php后缀)
如果想要更简洁的URL(比如/something对应index.php?r=something.php),可以把规则改成这样:
RewriteEngine On RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d # 将无后缀的请求路径拼接.php后作为r参数 RewriteRule ^([^/.]+)$ index.php?r=$1.php [L,QSA]
这样用户访问/something时,服务器会内部转发到index.php?r=something.php,URL里完全看不到r参数。
关键注意事项
- 安全过滤:一定要在
index.php里对$_GET['r']做合法性校验,比如限制只能访问指定目录下的PHP文件,防止恶意用户通过构造r参数进行路径遍历攻击(比如r=../../etc/passwd) - 缓存问题:测试新规则时建议用浏览器隐私模式,避免旧的URL缓存导致测试结果不准确
- 权限问题:确保
.htaccess文件对Apache服务器有可读权限,否则规则不会生效
内容的提问来源于stack exchange,提问作者Miky
相关产品推荐
相关产品推荐

