Apache .htaccess实现参数转子目录且不跳转的方法
Apache .htaccess 实现URL参数转子目录(内部映射)及目录访问限制
一、修正URL参数转子目录的规则
你的原规则失效是因为正则匹配范围不对:原规则^([^/]+)/([^/]+)\.jpg$只能匹配两级路径(如xxx/yyy.jpg),但你的目标路径是folder1/folder2/a.jpg(三级路径:两级目录+文件),正则无法覆盖。
正确的内部重写规则如下:
# 匹配带version参数的jpg请求,内部重写到对应子目录 RewriteCond %{QUERY_STRING} ^version=([^&]+)$ RewriteRule ^(.+)/([^/]+)\.jpg$ $1/%1/$2.jpg [L,QSD]
- 规则说明:
RewriteCond:精准匹配查询字符串为version=xxx的请求RewriteRule:^(.+)/([^/]+)\.jpg$:匹配任意层级目录下的jpg文件(比如folder1/folder2/a.jpg会捕获folder1/folder2到$1,a到$2)$1/%1/$2.jpg:拼接成目标路径(folder1/folder2/small/a.jpg,%1是RewriteCond捕获的版本值)[L]:停止后续规则处理[QSD]:丢弃原查询字符串,避免重写后URL仍带?version=small
如果你的路径层级固定为两级目录(比如folder1/folder2/),也可以用更精准的规则:
RewriteCond %{QUERY_STRING} ^version=([^&]+)$ RewriteRule ^([^/]+)/([^/]+)/([^/]+)\.jpg$ $1/$2/%1/$3.jpg [L,QSD]
二、禁止直接访问版本目录
如果版本目录是固定值(如small、medium),可以用RedirectMatch限制:
# 禁止直接访问small目录(含末尾斜杠的情况) RedirectMatch 403 ^/.+/small/?$
如果版本目录是动态不确定的,可匹配所有可能的版本目录(假设版本目录下仅存图片文件):
# 禁止直接访问任何版本目录 RewriteCond %{REQUEST_FILENAME} -d RewriteRule ^ - [R=403,L]
注意事项
- 确保Apache已启用
mod_rewrite模块 .htaccess需放在网站根目录,且服务器配置了AllowOverride All(允许重写规则生效)- 测试前清空浏览器缓存,避免缓存干扰结果
内容的提问来源于stack exchange,提问作者Majid Tabibpour
相关产品推荐
相关产品推荐

