Eu acho que o seu mal-entendido aqui é o caminho relativo.
Os arquivos .htaccess
não possuem nenhum comportamento especial que faça com que os caminhos sejam relativos; eles são essencialmente a mesma coisa que um bloco <Directory>
em termos de comportamento de configuração.
ErrorDocument
não possui nenhum conceito de contexto; quando você insere um caminho como /error.php
, que é sempre considerado como relativo à raiz do documento, independentemente de onde esteja configurado. A configuração mod_rewrite
em um bloco <Directory>
ou .htaccess
usa caminhos relativos, o que é provavelmente o que você está pensando para esse comportamento.
Algumas opções de como você poderia implementar isso ... você poderia ter um único error.php
que extraia o conteúdo dos arquivos de erro por aplicativo, dependendo do caminho da solicitação?
Ou você pode usar apenas mod_rewrite
para obter o comportamento de seleção de página de erro desejado (embora a lógica para corresponder ao que você está procurando seja uma bagunça complicada):
<Directory /path/to/docroot>
# First, we'll have a rule that will handle looking for an error.php in
# the app directory that the request is in...
# Not a file or a directory that exists:
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
# Capture the application directory that we're trying to load from (if
# there is one) for use in the next rule:
RewriteCond %{REQUEST_FILENAME} ^/path/to/docroot/([^/]+)/
# Check if an error.php exists in that directory;
RewriteCond /path/to/docroot/%1/error.php -f
# Send the response to the error page. It should set the 404 response code.
RewriteRule ^([^/]+)/.*$ $1/error.php [L]
# Ok, the previous pile of rules didn't apply; if the user's requesting
# a nonexistent resource, then either the user's not in an app subdirectory,
# or they're in a subdirectory that didn't have an error.php.
# So, this is a lot simpler:
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^ error.php [L]
</Directory>