我试图找出为什么Apache没有将ErrorDocument路径作为PHP $ _SERVER变量传递。
采用以下Apache VHOST配置。所有请求都发送到“index.php”,除非请求在“/ js”,“/ media”或“/ skin”中(非常像Magento)。
# Error documents
ErrorDocument 401 /core/error/notauthorized/
ErrorDocument 403 /core/error/notfound/
ErrorDocument 404 /core/error/notfound/
ErrorDocument 500 /core/error/internalservererror/
ErrorDocument 503 /core/error/serviceunavailable/
# index.php rewrite bootstrap
RewriteEngine On
RewriteCond %{HTTP_HOST} !^www\.(.*)$ [NC]
RewriteRule ^(.*)$ http://www.%{HTTP_HOST}$1 [R=301,L]
RewriteCond %{REQUEST_URI} !^/(js|media|skin)/
RewriteRule .* /var/www/mydomain.com/public/www/index.php [L]
假设用户试图访问“/ skin”目录中不存在的文件:“/skin / i / dont / exist.jpg”。
我的期望是,由于Apache发现该文件实际上不存在,它会尝试一个请求(与root相关)“/var/www/mydomain.com/public/www/core/error/notfound/ ”。它确实这样做,并通过引导程序正确处理请求。但是,所有$ _SERVER变量都指示最初请求的路径“/skin/i/dont/exist.jpg”而不是ErrorDocument路径。
Apache确实将“REDIRECT_STATUS”设置为404,但似乎这是我知道存在问题的唯一方法。我希望我的bootstrap index.php知道Apache实际上是在尝试请求“/ core / error / notfound /”,因此它的路由正确。
我错过了Apache设置吗?我对这应该如何运作的期望是不正确的?我在Ubuntu上使用PHP 7.0.8和Apache 2.4.18。
答案 0 :(得分:0)
我弄清楚出了什么问题。 RewriteCond和RewriteRule行需要驻留在指令中。
<Directory /var/www/mydomain.com/public/www>
RewriteEngine On
RewriteCond %{HTTP_HOST} !^www\.(.*)$ [NC]
RewriteRule ^(.*)$ http://www.%{HTTP_HOST}$1 [R=301,L]
RewriteCond %{REQUEST_URI} !^/(js|media|skin)/
RewriteRule .* /var/www/mydomain.com/public/www/index.php [L]
</Directory>
PHP $ _SERVER变量现在按预期返回:
["REQUEST_URI"]=>
string(13) "/skin/i/dont/exist.jpg"
["REDIRECT_URL"]=>
string(21) "/core/error/notfound/"
["SCRIPT_NAME"]=>
string(10) "/index.php"
也许如果有人读到这个,他们可以告诉我为什么添加指令会改变环境变量的行为?