.htaccess重写规则仅在URL含.php时生效的问题求助
解决多域名指向不同目录时无.php扩展名无法访问的问题
你的Rewrite配置已经实现了域名到目录的映射,但缺少无扩展名请求到.php文件的映射逻辑——Apache不会自动把yourdomain.com/about这类请求对应到about.php,除非你明确配置。下面给你两种可靠的解决方案:
方案1:用MultiViews快速实现(简单但需注意兼容性)
如果你的服务器允许开启MultiViews,这是最省事的方法:
- 在你的
httpd.conf或者.htaccess中添加:Options +MultiViews - 原理:MultiViews会让Apache自动搜索匹配请求路径的文件,比如请求
/about时,它会依次查找about.php、about.html等存在的文件并返回。 - 注意:如果你的目录下有同名的不同扩展名文件(比如
about.php和about.html),Apache会优先返回优先级高的那个(通常是php),但如果需要更精准控制,建议用方案2。
方案2:用RewriteRule显式映射(更可控)
这种方式通过Rewrite规则直接检查并添加.php扩展名,灵活性更高,适合需要精确控制的场景。修改你的配置如下:
RewriteEngine on RewriteMap urlmap txt:/var/www/html/map.txt # 规则1:处理无.php扩展名的文件请求 # 1. 确保请求的不是目录 RewriteCond %{REQUEST_FILENAME} !-d # 2. 检查映射后的路径加上.php是否存在 RewriteCond ${urlmap:%{HTTP_HOST}}/%{REQUEST_URI}.php -f # 3. 重写为带.php的路径 RewriteRule ^(.*)$ ${urlmap:%{HTTP_HOST}}/$1.php [L] # 规则2:处理原有的域名到目录映射(针对目录请求或已带扩展名的文件) RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule ^(.*)$ ${urlmap:%{HTTP_HOST}}/$1 [L]
规则解释:
[L]标记表示如果当前规则匹配,就停止执行后续规则,避免重复处理。- 第一个规则组只会在请求的不是目录且对应.php文件存在时触发,确保不会错误重写。
- 第二个规则组处理剩下的情况(比如请求目录时自动加载index.php,或者已经带.php的请求)。
额外注意事项:
- 确保
map.txt中的路径配置正确,比如cool.com /someuser(不要加末尾斜杠,因为规则里已经有/$1)。 - 给Apache授予
map.txt的读取权限,否则RewriteMap无法生效。 - 如果调试规则,可以在Apache 2.4+中开启日志追踪:
LogLevel alert rewrite:trace3,查看规则的执行过程。
内容的提问来源于stack exchange,提问作者Osman
相关产品推荐
相关产品推荐

