Eu escrevo a seguinte regra de reescrita:
<IfModule mod_rewrite.c>
RewriteCond %{QUERY_STRING} rp=\/knowledgebase\/.*
RewriteRule ^\/customer\/index.php /knowledgebase/ [R=301,L]
RewriteRule ^\/customer\/knowledgebase\.php$ /knowledgebase/ [R=301,L,QSA]
</IfModule>
Para redirecionar URL, como
https://www.example.com/customer/index.php?rp=/knowledgebase/5/DataNumen-Excel-Repair
parahttps://www.example.com/knowledgebase/
E URL de redirecionamento, como
https://www.example.com/customer/knowledgebase.php
parahttps://www.example.com/knowledgebase/
Mas ambos não funcionam. Por quê?
Atualizar
Eu tento colocar os códigos do MrWhite de /.htaccess para /customer/.htaccess e fazer algumas pequenas alterações para adotar as alterações, conforme abaixo:
RewriteCond %{QUERY_STRING} rp=/knowledgebase/
RewriteRule ^index\.php$ https://www.example.com/knowledgebase/ [QSD,R=301,L,NC]
RewriteRule ^knowledgebase\.php$ https://www.example.com/knowledgebase/ [R=301,L,NC]
Agora o redirecionamento funciona. No entanto, ele só funcionará para casos como:
https://www.example.com/customer/index.php?rp=/knowledgebase/9/DataNumen-PDF-Repair
mas para casos como
https://www.example.com/customer/index.php?a=b&c=d&rp=/knowledgebase/9/DataNumen-PDF-Repair
Isso não vai funcionar. Mesmo depois de alterar ^rp= para rp em RewriteCond.
Em
.htaccess
, o caminho de URL correspondente aoRewriteRule
padrão (ou seja^\/customer\/index.php
, ) não começa com uma barra, portanto, nunca corresponderá. O caminho de URL correspondente é relativo ao diretório que contém o.htaccess
arquivo (menos o prefixo da barra). (Ao contrário de quando usado em um contexto de servidor , quando o caminho de URL correspondente é o caminho de URL relativo à raiz do documento, começando com uma barra.)Você também precisará do
QSD
sinalizador na primeira regra para descartar a string de consulta na solicitação original, caso contrário, ela será passada como está.Ponto menor... não há necessidade de barra invertida-escapar barras no regex do Apache, uma vez que os espaços são o delimitador do argumento e a barra não tem nenhum significado especial de outra forma no regex.
Tente o seguinte em vez disso:
Ancorei a string de consulta na condição para que ela corresponda
rp=...
ao início da string de consulta, como no seu exemplo. O.*
no final do regex não é necessário.O
QSA
sinalizador não é necessário na segunda regra, pois a string de consulta é passada por padrão. OQSA
sinalizador só seria necessário se você precisasse mesclar a string de consulta original na solicitação com uma nova string de consulta que você estava anexando na substituição .O
<IfModule>
wrapper não é necessário, a menos que essas diretivas sejam opcionais e destinadas a serem usadas em vários servidores em que mod_rewrite pode não estar disponível. Veja esta pergunta na pilha de webmasters: https://webmasters.stackexchange.com/questions/112600/is-checking-for-mod-write-really-necessaryVocê deve testar primeiro com redirecionamentos 302 (temporários) para evitar possíveis problemas de cache.
Nesse caso, você precisaria remover o
customer/
prefixo em cada um dosRewriteRule
padrões , como fez em sua pergunta atualizada.Se o
rp
parâmetro URL tiver a intenção de corresponder a qualquer lugar na string de consulta, você deverá alterar o CondPattern para read(^|&)rp=/knowledgebase/
, em vez de simplesmente remover o^
prefixo. Ao remover o^
prefixo, você está potencialmente combinando demais, por exemplo.abcrp=/knowledgebase/...
também corresponderia, embora isso possa ou não ser um problema na realidade.Caso contrário, essas diretivas atualizadas parecem corretas, dependendo de quaisquer outros conflitos que possam existir com outras diretivas. O armazenamento em cache também pode ser um problema, especialmente se você estiver usando CDN.