Todas as minhas RedirectPermanent
regras adicionam uma string de consulta ao URL. Essa consulta indesejada corresponde ao URL aproximado redirecionado redefinido da RewriteRule
seguinte forma:
RewriteRule ^page-([0-9]+)-(.*)$ index.php?page=page&id=$1 [L]
Esta regra funciona perfeitamente para criar esse tipo de URL:
https://example.com/page-320-enfants
Os redirecionamentos 301 são definidos da seguinte forma:
RedirectPermanent /page-320-enfants /page-2028-pour-les-invitees
Problema: isso adiciona uma string de consulta ao URL recém-criado:
https://example.com/page-2028-pour-les-invitees?page=page&id=320
Tentei usar RewriteRule
(URL antigo para novo URL) em vez do RedirectPermanent
recomendado nas perguntas antigas, mas teve exatamente o mesmo efeito.
Estou esquecendo de algo?
ATUALIZAR :
Conforme recomendado, tentei usar RewriteRule
colocado antes da própria regra comum:
Options +FollowSymlinks
RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
RewriteCond %{HTTP_HOST} ^www\.(.*)$ [NC]
RewriteRule ^(.*)$ https://%1/$1 [R=301,L]
# Redirect Permanent #
RewriteRule ^page-2028-pour-les-invitees$ page-320-enfants [R=301,L]
# Common rules #
...
RewriteRule ^page-([0-9]+)-(.*)$ index.php?page=page&id=$1 [L]
...
Esta tentativa não é acionada. O problema poderia estar na sintaxe?
Sim, a
RedirectPermanent
diretiva (mod_alias) adicionará a string de consulta da reescrita anterior. ARewriteRule
diretiva (mod_rewrite) é processada primeiro, apesar da ordem aparente das diretivas, então reescreve internamente a solicitação paraindex.php?page=page&id=320
. ARedirectPermanent
diretiva é processada posteriormente, mas analisa apenas o caminho da URL originalmente solicitado (não o URL reescrito), então aciona um redirecionamento, mas a nova string de consulta da reescrita interna é então anexada (qualquer string de consulta na solicitação original seria de outra forma anexado).Se você já estiver usando o mod_rewrite para reescritas internas (e possivelmente outros redirecionamentos), será necessário usar o mod_rewrite para evitar tais conflitos.
Parece que você está vendo uma resposta em cache da
RedirectPermanent
diretiva anterior (301s são armazenados em cache persistentemente pelo navegador). Se o corretoRewriteRule
for colocado antes da reescrita acima, funcionaria conforme o esperado. Se você o colocasse depois disso, não faria nada, pois o caminho da URL não corresponderá.Esta regra parece estar no lugar certo (antes da reescrita interna), porém, o
RewriteRule
padrão (1º argumento) está incorreto e não corresponderá à URL solicitada, portanto a regra não faz nada.O
RewriteRule
padrão (um regex) corresponde ao caminho da URL depois que o prefixo do diretório (o caminho do arquivo para o.htaccess
arquivo) foi removido. O prefixo do diretório sempre termina com uma barra, portanto, o caminho da URL correspondente nunca começa com uma barra. Portanto, esta regra deve ser escrita assim:Para redirecionar de
/page-320-enfants
para/page-2028-pour-les-invitees
ATUALIZAR:
Ok, você removeu o prefixo de barra, no entanto, parece ter mudado de/para e omitiu o prefixo de barra necessário na string de substituição (2º argumento)!?
Supondo que você queira redirecionar ,
/page-320-enfants
isso deve aparecer à esquerda (primeiro argumento).O problema sem prefixo de barra na string de substituição
RewriteBase
(e sem diretiva) é que o prefixo de diretório será adicionado de volta e exporá o caminho do arquivo do servidor no redirecionamento externo - em outras palavras, o redirecionamento seria malformado (se ocorresse de forma alguma).