寻求Apache HTTPD 2.4适配多场景的RewriteCond路径校验规则
解决Apache 2.4 RewriteCond捕获URL第三段并校验目录存在的问题
嘿Joe,我明白你遇到的麻烦了——之前的规则没法覆盖带/不带结尾斜杠、以及第三段后还有额外路径的场景对吧?别担心,咱们来写一个能完美适配所有三个场景的规则。
核心思路
关键是用正则精准锁定URL路径的第三段,不管后面有没有斜杠或者更多层级,再用Apache内置的目录校验器检查磁盘上对应路径是否存在。
完整规则示例
RewriteEngine On # 捕获URL路径中的第三段(比如你示例里的folder1) RewriteCond %{REQUEST_URI} ^/[^/]+/[^/]+/([^/]+) # 检查/tmp下对应的目录是否存在(!表示"不存在",如果要校验存在就去掉!) RewriteCond /tmp/%1 !-d # 这里是目录不存在时的处理动作,示例返回404,你可以根据需求修改 RewriteRule ^ - [R=404,L]
规则详解
- 第一个RewriteCond:正则
^/[^/]+/[^/]+/([^/]+)专门匹配REQUEST_URI的结构:^/匹配URL开头的斜杠[^/]+匹配任意非斜杠字符(也就是单个路径段),连续用两次对应前两段(比如bar和foo)([^/]+)精准捕获第三段路径(三个场景里的folder1),不管后面有没有斜杠或者额外路径(比如场景c里的/bee/other)都不影响捕获结果
- 第二个RewriteCond:
/tmp/%1引用第一个条件捕获到的第三段内容,-d是Apache内置的校验器,用来检查该路径是否为存在的目录;!表示取反,也就是当目录不存在时触发后续规则 - RewriteRule:示例里的
^ - [R=404,L]表示如果目录不存在就返回404并停止后续规则处理,你可以替换成自己需要的动作(比如重写路径、跳转页面等)
适配场景验证
这个规则能完美覆盖你提到的三个场景:
- 场景a:
server.mydomain.com/bar/foo/folder1/→ 捕获folder1,检查/tmp/folder1 - 场景b:
server.mydomain.com/bar/foo/folder1→ 同样捕获folder1,正则会匹配到/bar/foo/folder1的第三段 - 场景c:
server.mydomain.com/bar/foo/folder1/bee/other→ 依然捕获folder1,忽略后面的额外路径层级
内容的提问来源于stack exchange,提问作者Joe Bar
相关产品推荐
相关产品推荐

