Apache中Require表达式的通配符配置问题求助
Apache Require表达式匹配动态文件名的正确配置方法
你之前的问题出在**Require expr的in操作符只支持精确字符串匹配**,不管是*还是(.*)都会被当成普通字符处理,没法实现通配效果。要匹配动态文件名,得用Apache表达式里的字符串匹配函数或者正则表达式。
以下是两种可行的配置方案:
方案1:使用通配符匹配函数 strmatch
这种方式适合简单的通配场景,语法更直观:
<RequireAny> Require expr "%{REQUEST_URI} in { '/stats/stats.php', '/stats/stats.js' } || strmatch(%{REQUEST_URI}, '/stats/js/container_*.js')" Include conf/restrict.conf </RequireAny>
这里的strmatch函数支持用*作为通配符,匹配任意长度的任意字符,刚好满足你匹配container_开头、.js结尾文件的需求。
方案2:使用正则表达式匹配
如果需要更复杂的匹配规则,正则表达式会更灵活:
<RequireAny> Require expr "%{REQUEST_URI} in { '/stats/stats.php', '/stats/stats.js' } || %{REQUEST_URI} =~ m#^/stats/js/container_.+\.js$#" Include conf/restrict.conf </RequireAny>
=~是正则匹配操作符,m#...#表示正则模式(用#作为分隔符避免和URI里的/冲突)^和$确保整个请求URI完全符合规则,不会出现部分匹配的问题.+匹配至少一个任意字符,\.转义后匹配实际的点号,确保只匹配.js结尾的文件
为什么之前的尝试无效?
你之前把带通配符的字符串放进in的列表里,in操作符会把列表里的每个条目当成完整字符串去和REQUEST_URI做精确比对,比如'/stats/js/container_*.js'会被当成一个固定字符串,自然匹配不上实际的/stats/js/container_ABCDEFG.js,所以才会返回403。
内容的提问来源于stack exchange,提问作者QuestionAsker1995
相关产品推荐
相关产品推荐

