新手求教:子目录URL重写后根文件链接失效,如何实现指定URL重写
解决子目录URL重写与根目录规则冲突的方案
嘿,这个问题我帮很多新手解决过——子目录加RewriteBase搞崩根目录链接,本质是没把子目录的规则和根目录隔离开。别慌,按下面的步骤来,既能实现你要的重写,又不会影响根目录的正常运行:
核心思路:给子目录单独配置.htaccess
不要去修改根目录的.htaccess,而是在/test/目录下新建一个独立的.htaccess文件,专门处理这个子目录的重写规则。这样两个目录的规则完全独立,不会互相干扰。
/test/.htaccess 具体代码
# 禁用目录浏览(和你提到的规则保持一致) Options -Indexes # 开启重写引擎并设置当前目录为基准 RewriteEngine On RewriteBase /test/ # 实现URL重写:将downloadh/xxx 映射到 downloadh.php?id=xxx # 先判断请求的不是真实文件/目录,避免覆盖真实资源 RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d # 匹配downloadh/后面的任意非斜杠字符(即你的id参数) RewriteRule ^downloadh/([^/]+)$ downloadh.php?id=$1 [L,QSA]
代码解释
RewriteBase /test/:明确告诉Apache,这个目录下的重写规则都基于/test/路径,避免Apache错误解析根目录的路径。- 两个
RewriteCond:确保只有当请求的路径不是真实存在的文件或目录时,才执行重写——这样不会把downloadh.php本身或者其他真实文件/目录给重写了。 RewriteRule里的([^/]+)是正则匹配,捕获downloadh/后面的所有内容(直到斜杠为止,正好对应你的id),然后通过$1把捕获的内容传给id参数。[L]表示这是最后一条规则,匹配到后就停止后续规则处理;[QSA]表示如果原URL有其他查询参数(比如?foo=bar),会自动附加到重写后的URL上,兼容性更好。
注意事项
- 确保你的服务器允许子目录使用
.htaccess——需要在Apache的配置文件中,给/test/对应的<Directory>块设置AllowOverride All(如果是虚拟主机,一般会默认开启,但如果是共享主机可能需要确认)。 - 测试时直接访问
http://example.com/test/downloadh/the-house-on-the-borderland,应该会正确映射到downloadh.php?id=the-house-on-the-borderland,同时根目录的所有链接依然正常。 - 根目录的
.htaccess不需要做任何修改,保持原来的正常规则即可。
内容的提问来源于stack exchange,提问作者vijay bharathi
相关产品推荐
相关产品推荐

