使用.htaccess将目录式URL重写为PHP文件的问题排查
解决URL重写问题的正确配置
问题根源
- 第一个规则触发404:如果
.htaccess放在naveesh目录下,规则开头的/naveesh/是绝对路径,和.htaccess相对当前目录的匹配逻辑冲突,导致无法正确匹配请求。 - 第二个规则出现过多重定向:隐藏
.php扩展名的规则会和services重写规则循环触发——重写后的services.php会被扩展名规则再次处理,引发无限内部重定向。
正确配置方案
方案1:.htaccess放在naveesh子目录下
RewriteEngine On RewriteBase /naveesh/ # 优先处理services的动态URL重写 RewriteRule ^services/([^/]+)/?$ services.php?serv=$1 [L,QSA] # 隐藏.php扩展名,添加条件避免循环 RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{REQUEST_FILENAME}.php -f RewriteRule ^(.*?)/?$ $1.php [L]
方案2:.htaccess放在网站根目录(htdocs)下
RewriteEngine On RewriteRule ^naveesh/services/([^/]+)/?$ /naveesh/services.php?serv=$1 [L,QSA]
关键注意事项
- 规则顺序优先:必须先处理动态URL重写,再处理静态文件的扩展名隐藏,避免循环匹配。
- 路径匹配逻辑:子目录下的
.htaccess不要用绝对路径开头,配合RewriteBase指定基准路径更稳妥。 - 参数格式转换:如果需要把URL中的
Boat-Dealers转成参数Boat%20Dealers(连字符换空格),可以二选一:- 规则加
B标志:RewriteRule ^services/([^/]+)/?$ services.php?serv=$1 [L,QSA,B] - PHP代码处理:
$_GET['serv'] = str_replace('-', ' ', $_GET['serv']);
- 规则加
内容的提问来源于stack exchange,提问作者consolenine
相关产品推荐
相关产品推荐

