为什么我的 SetEnvIfNoCase 指令与请求的 URI 不匹配?

为什么我的 SetEnvIfNoCase 指令与请求的 URI 不匹配?

我正在尝试设置 Apache,以便各种错误页面能够显示与错误上下文相符的页眉/页脚。如果用户请求的是公司页面,我希望以公司的外观和感觉显示错误。如果错误发生在我们的应用程序中,我希望以应用程序的外观显示它。不幸的是,Apache 不想配合。

在我的测试中,我已经设置 Apache 在显示 HTTP 错误时使用特定文档503

# Service Unavailable
ErrorDocument 503 /errors/error_503.shtml

在该文档中,我使用 SSI 指令和环境变量构建了一些 if/else 逻辑,这些逻辑可以根据环境变量的内容有条件地包含此或该标头。这是我的测试文件:

<!--#if expr="${is_corporate}" -->
corporate here.
<!--#else -->
I'M NOT CORPORATE.
<!--#endif -->
<!--#echo var="is_corporate" --> 
<!--#echo var="REQUEST_URI" --> 
This is a 503 error message! Check it out!

但是,我似乎无法匹配SetEnvIfapache 配置中使用的请求 URI,我无法理解原因。

   <Location />
      # Allow error documents to use the application or corporate header as appropriate
      SetEnvIfNoCase Request_URI /corporate/home/ is_corporate   # this does not match
      SetEnvIfNoCase Request_URI ^/$ is_corporate                # this does not match
      SetEnvIfNoCase Request_URI ^/c is_corporate                # this does not match
      SetEnvIfNoCase Request_URI ^/C is_corporate                # this does not match
      SetEnvIfNoCase Request_URI .*/ is_corporate                # this matches
      SetEnvIfNoCase Request_URI .*  is_corporate                # this matches
    </Location>

在这个特定情况下,我的错误文档打印的内容REQUEST_URI显示:/Corporate/Home/,并且始终表示为is_corporate空。使用SetEnvIfNoCase应该使其成为不区分大小写的匹配,但尝试大写/小写似乎没有什么区别。

由于SetEnvIf正则表达式应该与 pcre 兼容,所以我在 perl 中测试了正则表达式,只是为了确保我的正则表达式是合法的,并且应该按照我预期的方式工作:

vezult@zapazoid:~$ echo '/Corporate/Home' |perl -e 'while(<>) { if (/^\/c/i) { print("match!!: $_\n");} else { print("no match: $_\n"); }}'
match!!: /Corporate/Home

确实如此。无论如何,我很困惑。我可能遗漏了什么,导致我的SetEnvIf语句无法按预期运行?

答案1

SetEnvIf 的Request_URI参数在提供错误文档的过程中似乎会使用错误文档的路径进行更新。

一个解决方法是匹配具有父路径的其他内容,例如Referer标题。

相关内容