Apache - Precisa reescrever / entrar em contato / para /contato.php

3

Usando .htaccess das minhas pergunta anterior , editei para adicione uma regra de reconfiguração para regravar /contact/ para /contact.php e /xyz/contact/ para /contact.php?lang=xyz . Enquanto o segundo funciona, o primeiro ainda procura pelo diretório que não existe, retornando 404 code. Ambos redirecionam para o belo trabalho de variante de URL, exatamente como esperado. Aqui estão minhas configurações de .htaccess para isso:

# No directory listing, no multi views, follow symlinks
Options -Indexes -MultiViews +FollowSymLinks

# Redirects and rewrites allowed
RewriteEngine on

# ...

# Redirect direct requests for "contact.php?lang=xyz" to "/xyz/contact/"
RewriteCond %{ENV:REDIRECT_STATUS} ^$
RewriteCond %{QUERY_STRING} ^lang=([a-z]{2,3})$
RewriteRule ^contact\.php$ /%1/contact/? [R=301,L]

# Redirect direct request for "contact.php" to "/contact/"
RewriteCond %{ENV:REDIRECT_STATUS} ^$
RewriteRule ^contact\.php$ /contact/? [R=301,L]

# Internally rewrite "/xyz/contact/" to "/contact.php?lang=xyz"
RewriteRule ^([a-z]{2,3})/contact/?$ /contact.php?lang=$1 [L]

# ...

# Internally rewrite "/contact/" to "/contact.php"
RewriteRule ^/contact/?$ /contact.php [L]
    
por Polda18 02.04.2018 / 17:23

1 resposta

5
# Internally rewrite "/contact/" to "/contact.php"
RewriteRule ^/contact/?$ /contact.php [L]

Nos arquivos por diretório .htaccess você precisa remover o prefixo barra no padrão RewriteRule (como você fez nas diretivas anteriores). Então, isso deve ser escrito como:

RewriteRule ^contact/?$ /contact.php [L]

Isso corresponde às solicitações de /contact e /contact/ .

O prefixo de barra não é usado no padrão RewriteRule porque em um contexto .htaccess , o prefixo de diretório (que termina notavelmente com uma barra) é primeiro removido do caminho de URL que corresponde ao padrão RewriteRule . (O prefixo de diretório sendo o caminho do sistema de arquivos no qual o arquivo .htaccess está localizado.)

    
por 02.04.2018 / 17:42