Apache中移除.html与.php扩展名问题求助
解决无扩展名请求PHP页面返回404的Rewrite规则问题
我来帮你搞定这个问题!先看你给出的规则,核心问题出在条件语法错误和未完成的规则上,导致PHP的重写逻辑根本没生效。
原规则的问题点
- 条件缺少空格:比如
RewriteCond %{REQUEST_FILENAME}!-d这里,%{REQUEST_FILENAME}和!-d之间没有空格,Apache无法正确解析这个条件判断,直接跳过了后续的PHP重写规则。 - PHP规则未完成:你贴的代码里PHP部分的
RewriteRule ^(....明显没写完,正确的匹配模式应该是^(.*)$。 - -F标志的潜在问题:
-F会检查文件是否存在且可被服务器访问,有时候可能因为权限或上下文限制,不如-f(仅检查普通文件存在)稳定。
修正后的完整Rewrite规则
把下面的代码替换你现有的规则,就能同时处理.html和.php的无扩展名请求:
RewriteEngine On # 处理无扩展名请求 → 对应.html文件 RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{REQUEST_FILENAME}\.html -f RewriteRule ^(.*)$ $1.html [L] # 处理无扩展名请求 → 对应.php文件 RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{REQUEST_FILENAME}\.php -f RewriteRule ^(.*)$ $1.php [L]
规则详解
RewriteCond %{REQUEST_FILENAME} !-d:确保请求的不是真实存在的目录,避免把目录请求错误重写到文件。RewriteCond %{REQUEST_FILENAME}\.html -f:检查当前请求路径加上.html后缀后,对应的文件是否真实存在。RewriteRule ^(.*)$ $1.html [L]:将无扩展名的请求重写到带.html的文件,[L]表示匹配到这条规则后就停止后续规则执行,避免冲突。- PHP部分的逻辑和HTML完全一致,只是后缀换成
.php。
额外注意事项
- 确保你的Apache服务器已经启用了
mod_rewrite模块。 - 确保存放
.htaccess的目录在Apache配置中设置了AllowOverride All或AllowOverride FileInfo,否则Rewrite规则不会生效。
内容的提问来源于stack exchange,提问作者Stephen Toth
相关产品推荐
相关产品推荐

