如何配置.htaccess移除PHP后缀且不影响指定子文件夹运行
问题原因
之前配置的重写规则没有对lib目录做路径豁免,全局匹配所有请求追加.php后缀的逻辑会错误作用到lib目录下的资源,要么把lib下的脚本请求错误重写到根目录找文件,要么打乱内部脚本的引用路径,最终导致lib内PHP脚本无法正常运行。
正确配置代码
将以下内容写入站点根目录的.htaccess文件即可,不需要改动lib目录下的任何原有配置:
RewriteEngine On # 最高优先级:lib目录下所有请求直接跳过后续重写规则,完全保留原有访问逻辑 RewriteRule ^lib/ - [L] # 可选配置:统一URL格式,将根目录下带.php后缀的访问301跳转到无后缀地址 RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{REQUEST_URI} ^/([^/]+\.php)$ RewriteCond %{DOCUMENT_ROOT}/%1 -f RewriteRule ^ /%1 [R=301,L] # 根目录无后缀请求重写规则:仅匹配根目录单级路径,校验对应php文件存在才转发 RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{REQUEST_URI} !^/lib/ RewriteCond %{DOCUMENT_ROOT}/$1.php -f RewriteRule ^([^/]+)$ $1.php [L]
规则说明
- 第一条排除规则是解决lib目录失效的核心:只要请求路径以
lib/开头,就直接终止重写流程,不管是直接访问lib下的脚本,还是根目录页面通过include/require引入lib下的文件,都不会被重写规则干扰 - 可选的301跳转规则配置后,用户访问
/home.php会自动跳转到/home,避免同一个页面出现两个可访问地址,配置后需要清空浏览器缓存再测试,避免旧缓存影响跳转结果 - 最后一条重写规则做了多层限制:只匹配根目录下没有子路径的请求、不会处理目录请求、只有对应.php文件真实存在时才做内部重写,不会误改其他子目录或静态资源的访问逻辑
校验方法
配置完成后做两项测试即可确认生效:
- 访问根目录下的页面,比如原地址是
/news.php,现在访问/news可以正常打开,访问/news.php会自动跳转到/news(如果开启了可选配置) - 访问lib目录下的原有脚本地址,或者触发页面中调用lib脚本的逻辑,返回结果和配置重写前完全一致,不会出现404、403或者代码执行错误
内容的提问来源于stack exchange,提问作者Greywood
相关产品推荐
相关产品推荐

