htaccess mod_rewrite 配置memes目录图片路径重写为查询参数规则
实现方案
所有规则需放置在 /memes/ 目录下的 .htaccess 文件中,提前确认Apache已开启mod_rewrite模块即可使用。
场景1:保留子目录层级,同时传递folder与pic参数
适配你需要的第一种重写效果:访问旧地址http://www.localhost/memes/01/blaa.jpg时,实际路由到http://www.localhost/memes/index.php?folder=01&pic=blaa.jpg:
# 启用重写引擎 RewriteEngine On # 跳过对已存在真实文件、目录的重写,避免死循环 RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d # 匹配「一级子目录 + 具体文件」的路径结构 RewriteRule ^([^/]+)/([^/]+)$ index.php?folder=$1&pic=$2 [L,QSA]
规则说明:
- 正则
^([^/]+)/([^/]+)$专门匹配memes目录下「单层路径/文件」的请求,比如01/blaa.jpg、02/blaa2.png这类旧URL结构 [L]标记表示规则匹配后立即终止后续规则执行,[QSA]会自动保留原URL携带的其他查询参数,不会造成参数丢失
场景2:忽略子目录层级,仅传递pic参数
适配你需要的第二种重写效果:不管路径里有多少层子目录,只把最后一级的文件名传给后端,路由到http://www.localhost/memes/index.php?pic=blaa.jpg:
# 启用重写引擎 RewriteEngine On # 跳过对已存在真实文件、目录的重写,避免死循环 RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d # 匹配任意层级路径,仅捕获最末尾的文件名作为参数 RewriteRule ^(?:.*/)?([^/]+)$ index.php?pic=$1 [L,QSA]
规则说明:
- 正则中的
(?:.*/)?用于匹配任意层级的中间路径,不对这部分内容做捕获,仅取最后一段文件名作为pic参数值 - 不管请求是
/memes/01/blaa.jpg还是更深层的/memes/01/sub/blaa.jpg,最终都会将blaa.jpg传入后端PHP程序
注意事项
- 两组规则可根据实际业务需求二选一,无需同时启用
!-f和!-d的判断条件是必须保留的:如果后续在memes目录下存放了真实的静态资源、实际存在的目录,Apache会直接返回对应内容,不会触发重写逻辑,从根源避免无限重定向的死循环问题
内容的提问来源于stack exchange,提问作者user12880465
相关产品推荐
相关产品推荐

