Minha situação é a seguinte: Eu tenho arquivos estáticos na pasta public/
no meu servidor local. Qualquer pedido que entrar deve ser encaminhado para essa pasta, mas se um arquivo nessa pasta for acessado diretamente, ele deve ser um 404 ou redirecionar para o 'slug'. Exemplo:
Request: /my-file
Should rewrite to: /public/my-file.html
URL should be: http://localhost/my-file
Request: /public/my-file.html
Should rewrite to: /public/my-file.html
URL should be: http://localhost/my-file
Eu tenho as seguintes regras e condições no meu .htaccess
:
RewriteCond %{DOCUMENT_ROOT}/public/%{REQUEST_URI}.html -f
RewriteRule ^.*$ /public/$0.html [L,C]
RewriteCond %{REQUEST_URI} ^/public
RewriteRule ^public/(.+).html$ /$1 [R=301,L]
De cima para baixo:
- O
/public/{request}.html
é um arquivo?
- Reescreva se (1) for verdadeiro:
/public/{request}.html
e encadeie para (3) para evitar um loop de redirecionamento
- A solicitação original começa com
/public
?
- Reescreva se (3) for verdadeiro e a solicitação original corresponder a
public/{request}.html
: /{request}
. Também crie um 301
header, que informa ao meu navegador e rastreadores que a página foi movida permanentemente. A solicitação será executada em todas as regras novamente
Então, se fizermos esses dois pedidos:
1. Request: /my-file
-
/public/my-file.html
é avaliado como verdadeiro; o arquivo existe na minha pasta.
- Reescreve para:
/public/my-file.html
, cadeia para 3
- A solicitação original não corresponde.
- Ignorado
Até agora, tudo bem; o arquivo correto é mostrado com o URL que eu quero. Solicitação número 2, que é uma solicitação para o arquivo real, como existe na estrutura do arquivo:
2. Request: /public/my-file.html
-
public/public/my-file.html.html
avalia como false, o arquivo não existe na minha pasta.
- Ignorado
- A solicitação original corresponde: começa com
/public
- Reescreva
public/my-file.html
para /my-file
e vá para o início.
Agora, depois de (4) no segundo exemplo, eu diria que a solicitação corresponde ao primeiro exemplo, o que significa que eu recebo a página que estou procurando com o URL correto (por causa do 301). Mas não funciona: o URL não muda, estou recebendo a página que estou procurando, mas não o URL (que deve ser /my-file
).
Alguém tem ponteiros? Eu acho que estou quase lá, mas fazendo algo errado com o encadeamento ou redirecionamento. Obrigado!
Editar
Depois de ter tentado todos os tipos de coisas, finalmente decidi que o que eu quero provavelmente não é possível. Eu quero redirecionar um arquivo existente ( public/my-file.html
) para um arquivo inexistente ( my-file
) visualmente , mas internamente eu quero que ele solicite o caminho do arquivo existente. Isso invariavelmente resultará em um loop de redirecionamento, porque mod_rewrite simplesmente não funciona dessa maneira:
User typed: website.com/my-file
Rewrites to file path: .../wwwroot/public/my-file.html
Internal redirect
Rewriterule found: /public/my-file.html should redirect to my-file
See above.
Eu não encontrei nenhuma situação comparável aqui no ServerFault ou no StackOverflow - geralmente a regravação vai para um arquivo .php
genérico, não para um arquivo .html
existente.
Eu marquei a resposta de Krist van Besien como a certa, uma vez que me apontou na direção certa para descobrir tudo isso.
Editar 2
Em uma pergunta de acompanhamento, o problema foi resolvido usando %{THE_REQUEST}
: Veja aqui