Regra de reconfiguração "pegar todos" para o apache que não causa urls duplicados de .htaccess

2

Você pode criar uma regra de reconfiguração "pega-tudo" para o apache que atue como um alias, mas pode ser implementada em um arquivo .htaccess enquanto um alias não pode.

Como exemplo, supondo que seu documento raiz seja uma hierarquia como esta:

/.htaccess
/test/
/test/.htaccess
/test/file

Você pode "Alias" todas as solicitações para a pasta de teste, tornando a raiz .htaccess conter:

RewriteEngine On
RewriteRule ^(.*)$ /test/$1 [L]

E o segundo .htaccess contém:

RewriteEngine On

Isso funciona muito bem e geralmente é tudo o que você precisa. Apenas tem um problema - cria vários URLs válidos. Agora você pode acessar o arquivo com /file e /test/file .

Normalmente, isso não é um problema, mas se você adicionar um arquivo chamado /test/test , verá o problema, pois o falso alias pára de funcionar completamente. Se a subpasta tiver um .htaccess próprio, pode causar grandes dores de cabeça.

Existe alguma maneira de falsificar um alias de um .htaccess sem os URLs originais ainda funcionando? (Algum RewriteCond para a subpasta que verificaria se já fomos reescritos ou não?)

    
por J V 20.05.2017 / 22:41

1 resposta

1

... but if you add a file called /test/test you'll see the problem, as the fake alias stops working entirely.

Sim, o segundo arquivo .htaccess no subdiretório evita que o URL seja reescrito (já que a reconfiguração de mod não é herdada por padrão). Você poderia contornar isso apenas com o arquivo .htaccess no documento raiz que reescreve todos os pedidos que ainda não foram reescritos. Por exemplo:

RewriteEngine On
RewriteCond %{ENV:REDIRECT_STATUS} ^$
RewriteRule (.*) /test/$1 [L]

A variável de ambiente REDIRECT_STATUS está vazia na solicitação inicial e definida como 200 (OK) após a primeira reescrita bem-sucedida.

No entanto, se você ainda precisar de um arquivo .htaccess no subdiretório (para outras diretivas mod_rewrite), então você precisará:

  • repita essas diretivas nos subdiretórios .htaccess file. (Você, então, não precisaria estritamente da diretiva RewriteCond acima no arquivo pai .htaccess .)

  • Ou habilite a herança mod_rewrite. Mas eu acho que você lutaria no Apache 2.2. Você provavelmente precisaria de algo como RewriteOptions InheritBefore (nos subdiretórios .htaccess file), que está disponível apenas no Apache 2.4.

It just has one problem - it creates multiple valid urls.

O método acima resolve este problema também, uma vez que todos os pedidos são agora reescritos (o que é mais parecido com o comportamento de um Apache Alias na configuração do servidor).

Caso contrário, você precisaria assegurar-se de que o subdiretório base fosse único para poder implementar um redirecionamento canônico de volta à raiz do documento se o subdiretório base fosse acessado diretamente. Por exemplo:

RewriteCond %{THE_REQUEST} ^[A-Z]{3,9}\ /unique-subdir
RewriteRule (.*) /$1 [R=301,L]

THE_REQUEST contém a primeira linha do cabeçalho da solicitação inicial e não é alterado quando a solicitação é reescrita.

    
por 21.05.2017 / 00:04