我正在尝试设置 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!
但是,我似乎无法匹配SetEnvIf
apache 配置中使用的请求 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
标题。