.htaccess配置URL重写规则在服务器中不生效问题求助
问题排查与修复方案
现有规则的错误点
- 放在
/milan目录下的.htaccess的匹配路径为相对路径(自动去掉当前目录前缀),不会携带开头的/,所以^/(.*)$规则完全匹配不到任何请求 - 第一条规则使用了
R=301强制跳转,会直接暴露public目录的实际路径,不符合隐藏目录的需求,应该使用内部重写 - 第二条规则的匹配路径多了多余的
public前缀,目标路径也没有正确指向public目录下的auth/index.php,同时未配置重写基础路径导致路径解析错误
修复后的配置
第一步:修改/milan/.htaccess内容
RewriteEngine On # 配置重写基础路径,适配子目录部署 RewriteBase /milan/ # 隐藏public目录:所有请求内部重写到public目录,无跳转 RewriteCond %{REQUEST_URI} !^/milan/public/ RewriteRule ^(.*)$ public/$1 [NC,L] # 动态参数转静态路径:匹配auth下的静态路径,转发到对应的PHP文件 RewriteRule ^auth/([a-zA-Z0-9_-]+)/?$ public/auth/index.php?page=$1 [QSA,L]
第二步:新增/milan/public/.htaccess(可选,优化体验)
用于禁止直接访问原始带参数的URL,自动跳转至静态路径格式:
RewriteEngine On RewriteBase /milan/public/ # 原始带参数URL自动301跳转到静态路径 RewriteCond %{QUERY_STRING} page=([a-zA-Z0-9_-]+) RewriteRule ^auth/index\.php$ /milan/auth/%1/? [R=301,L]
生效验证注意事项
- 确认Apache已经开启
mod_rewrite模块,站点目录的AllowOverride配置设置为All,允许.htaccess文件生效 - 测试前清空浏览器缓存,之前错误的301跳转规则会被浏览器永久缓存,影响测试结果
内容的提问来源于stack exchange,提问作者Om Prakash
相关产品推荐
相关产品推荐

