如何移除URL中的.php扩展名且不中断PHP代码执行?
解决移除.php扩展名后PHP代码无法运行的问题
你的.htaccess只完成了外部重定向(把带.php/.html的旧URL跳转到不带扩展名的新URL),但缺少了内部重写规则——也就是把用户访问的不带扩展名的请求,映射到实际的.php文件上。服务器收到/xxx的请求时,默认只会找同名目录或静态文件,不会自动去解析xxx.php,这就是PHP代码不运行的原因。
修改后的完整.htaccess配置
RewriteEngine On # 1. 外部重定向:把带.php/.html/index的URL跳转到不带扩展名的版本(301永久重定向) RewriteCond %{THE_REQUEST} \s/+([^/.]+)\.php[\s?] [NC] RewriteRule ^ /%1 [R=301,NE,L] RewriteCond %{THE_REQUEST} \s/+([^/.]+)\.html[\s?] [NC] RewriteRule ^ /%1 [R=301,NE,L] RewriteCond %{THE_REQUEST} \s/+([^/.]+)index[\s?] [NC] RewriteRule ^ /%1 [R=301,NE,L] # 2. 内部重写:把不带扩展名的请求映射到对应的.php文件(仅内部处理,不改变URL) # 排除真实存在的文件和目录,避免干扰静态资源(如图片、CSS、JS)或真实目录的访问 RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule ^([^/.]+)/?$ $1.php [L]
关键修正说明
- 修正重定向规则的正则:原来的
(\.+?)会错误匹配多个点,换成([^/.]+)可准确匹配不含斜杠和点的文件名。 - 添加内部重写规则:
RewriteCond %{REQUEST_FILENAME} !-f:过滤真实存在的文件(比如静态图片、CSS)RewriteCond %{REQUEST_FILENAME} !-d:过滤真实存在的目录RewriteRule ^([^/.]+)/?$ $1.php [L]:将不带扩展名的请求自动追加.php后缀,让服务器解析PHP脚本,[L]表示终止后续规则匹配。
额外注意事项
- 确认Apache服务器已启用
mod_rewrite模块。 - 在Apache站点配置中,对应目录需设置
AllowOverride All,否则.htaccess规则无法生效。
内容的提问来源于stack exchange,提问作者cass-dev27
相关产品推荐
相关产品推荐

