Incompativo .htaccess relativo Comportamento ErrorDocument

1

Na raiz do documento, eu coloco um .htaccess com:

ErrorDocument 404 /error.php

Como isso está em um arquivo .htaccess, o Apache procura por error.php no caminho relativo, para que eu possa colocar diferentes arquivos error.php em subpastas diferentes para fazer com que ele execute diferentes error.php:

request /app1/not-exists.txt : yields /app1/error.php
request /app2/not-exists.txt : yields /app2/error.php
request /not-exists/not-exists.txt : yields /error.php

Esse é o comportamento desejado. No entanto,

request /not-exists/app1/not-exists.txt : yields /app1/error.php
request /app2/app1/not-exists.txt : yields /app1/error.php

Isso não parece um comportamento esperado. Eu esperava:

request /not-exists/app1/not-exists.txt : yields /error.php
request /app2/app1/not-exists.txt : yields /app2/error.php (or maybe /error.php)

ou, na pior das hipóteses, algum tratamento genérico de erros do Apache. Eu estou entendendo mal o que o Apache deve fazer aqui? A documentação não parece deixar isso claro.

    
por dlo 19.09.2012 / 18:53

1 resposta

1

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>
    
por 19.09.2012 / 19:22