如何在子目录通过.htaccess实现URL到PNG映射?现有规则失效求助
让我帮你梳理下这个.htaccess规则的问题,顺便讲讲子目录里自动添加文件扩展名的通用方案~
一、你的原规则不生效的原因及修正方案
先拆解下你原规则里的核心问题:
- 错误使用变量:
RewriteCond里的%1是用来引用前面RewriteCond正则捕获的内容,但你这里的RewriteCond没有捕获组,应该用RewriteRule里捕获的$1来指代STRING部分。 - 路径匹配偏差:如果你的
.htaccess放在网站根目录且设置了RewriteBase /test/,RewriteRule的目标路径不要加开头的斜杠,否则会跳转到网站根目录而非/test/子目录下。
根据你的需求,分两种场景给出修正后的规则:
场景1:.htaccess放在/test/子目录下
这种情况最简洁,因为.htaccess本身就在目标目录,不需要额外指定根路径:
Options All -Indexes -MultiViews RewriteEngine On # 排除真实存在的目录 RewriteCond %{REQUEST_FILENAME} !-d # 检查对应的PNG文件是否存在于当前目录 RewriteCond %{REQUEST_FILENAME}.png -f # 将请求重写为带.png的路径 RewriteRule ^([^/]+)/?$ $1.png [NC,L]
场景2:.htaccess放在网站根目录下
需要明确指定/test/目录的路径:
Options All -Indexes -MultiViews RewriteEngine On RewriteBase /test/ # 排除真实存在的目录 RewriteCond %{REQUEST_FILENAME} !-d # 检查/test/目录下是否存在对应的PNG文件 RewriteCond %{DOCUMENT_ROOT}/test/$1.png -f # 重写请求到/test/STRING.png RewriteRule ^([^/]+)/?$ $1.png [NC,L]
二、子目录中自动添加文件类型扩展名的通用方法
如果需要给子目录的请求自动添加多种扩展名(比如.png、.jpg、.html等),核心思路是按优先级检查对应扩展名的文件是否存在,存在则重写。
比如在/subdir/子目录的.htaccess中,实现优先匹配.png,再匹配.jpg,最后匹配.html的规则:
RewriteEngine On # 先排除真实存在的文件和目录,避免重复重写 RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d # 1. 优先匹配PNG文件 RewriteCond %{REQUEST_FILENAME}.png -f RewriteRule ^(.+)$ $1.png [NC,L] # 2. 其次匹配JPG文件 RewriteCond %{REQUEST_FILENAME}.jpg -f RewriteRule ^(.+)$ $1.jpg [NC,L] # 3. 最后匹配HTML文件 RewriteCond %{REQUEST_FILENAME}.html -f RewriteRule ^(.+)$ $1.html [NC,L]
这样当用户访问https://website.com/subdir/STRING时,服务器会依次检查STRING.png、STRING.jpg、STRING.html是否存在,找到第一个存在的文件就返回对应内容。
内容的提问来源于stack exchange,提问作者cava145
相关产品推荐
相关产品推荐

