使用PHP引导程序配置获取Apache“ErrorDocument”路径

时间:2016-07-27 00:32:50

标签: php apache

我试图找出为什么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。

1 个答案:

答案 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"

也许如果有人读到这个,他们可以告诉我为什么添加指令会改变环境变量的行为?