使用mod_rewrite隐藏子目录但保留访问文件的规则配置问题
解决mod_rewrite隐藏子目录保留文件的配置问题
你的需求是把www.mysite.com/product/admin/docs/info.php这类URL重写为www.mysite.com/product/info.php,也就是隐藏product之后到目标文件前的所有子目录,只保留product和最终文件名。原配置没生效是因为规则逻辑没抓对路径匹配与提取的要点,下面是修正后的配置:
#Redirection code starts RewriteEngine On # HTTPS和www跳转(这部分逻辑没问题,保留) RewriteCond %{HTTPS} off [OR] RewriteCond %{HTTP_HOST} !^www\. [NC] RewriteCond %{HTTP_HOST} ^(?:www\.)?(.+)$ [NC] RewriteRule ^ https://www.%1%{REQUEST_URI} [L,NE,R=301] # 隐藏product后的子目录,仅保留目标文件 # 避免对直接访问product下的文件触发重写,防止循环 RewriteCond %{REQUEST_FILENAME} !-f # 匹配product/后带多层子目录的路径,捕获最后一个文件名 RewriteRule ^product/.+/([^/]+)$ /product/$1 [L,NC]
配置说明:
- 去掉了重复的
RewriteEngine On,模块只需要开启一次 RewriteCond %{REQUEST_FILENAME} !-f:确保只对不存在于product目录下的请求路径生效,避免直接访问/product/info.php时触发不必要的重写- 正则
^product/.+/([^/]+)$:精准匹配product/开头、包含至少一层子目录的路径,用捕获组提取最后一段文件名 - 重写目标
/product/$1:将路径替换为product/加上捕获到的文件名,NC忽略大小写,L终止后续规则执行
如果需要让浏览器地址栏显示重写后的URL(外部跳转),可以在RewriteRule的标记中添加R=301(永久跳转),示例:
RewriteRule ^product/.+/([^/]+)$ /product/$1 [L,NC,R=301]
内容的提问来源于stack exchange,提问作者kwame atuapem
相关产品推荐
相关产品推荐

