301 redirecionamento com PHP e MySQL no 404
-
09-09-2019 - |
Pergunta
Eu estou transferindo um grande site estático de mais de 500 páginas para uma instalação Joomla, mas o que eu estou querendo fazer, ao invés de código de arquivo de uma linha 500+ .htaccess, é a utilização do PHP construído em 301 cabeçalho redirecionamento para solicitações dinamicamente redirecionamento que vêm para o novo URL.
Assim, por exemplo, depois de mover o site, a seguinte URL faria 404 sem um redirecionamento -
http://www.foo.com/old_page.html
Eu gostaria que redirecionar para
http://www.foo.com/old-page.php
Então, eu gostaria de criar um banco de dados MySQL de URLs antigos e seus correspondentes nova URL e, em seguida, se o servidor vai voltar a 404, por isso primeiro para verificar o DB para o URL antigo existente, e se combinado, para emitir um redirecionamento 301 para o novo URL. Certo, estou fazendo sentido aqui?
Como eu faria isso? I pode "falar" a lógica, mas realmente não sei por onde começar ou como realizá-lo porque, embora eu entendo PHP, eu realmente não entendo como isso funcionaria com Apache (ou mesmo se seria por exemplo ...) ?
E se você souber de quaisquer scripts lá fora, que já está fazendo isso, tanto melhor.
Solução
Na sua configuração do Apache, definir um ErrorDocument de qualquer /404handler.php roteiro você gosta. Em seu contexto prazo, $ _ SERVER [ 'REQUEST_URI'] será o URI da página original solicitada. Faça a sua pesquisa de banco de dados, e se você encontrar uma página que você deseja redirecionar fazer, uso header ( "Location:". $ Onde). para redirecionar a ele
Outras dicas
A maneira mais simples que eu posso pensar seria usar mod_rewrite (link é para um ótimo tutorial introdução) para redirecionar todas as solicitações de entrada para um único script PHP (ou usar um sinalizador para que esse redirecionamento só acontece se o pedido é para um arquivo que não existe), com o endereço solicitado passado como parte da string de consulta. A partir daí, ter o olhar script PHP até onde esse pedido deve ir, e redirecionamento para ele.
Então, se alguém tenta abrir http://www.foo.com/old_page.html, o mod_rewrite iria enviar para algo como http://www.foo. com / redirect.php? page = old_page.html . redirect.php em seguida, faz uma pesquisa de banco de dados para ver o que o novo endereço para "old_page.html" é, e redirecionamentos para lá.
Em vez de criar um banco de dados, por que não basta colocar um redirecionamento para uma página com o velho URL (ie. Old_page.html)?
Uma vez que você está, obviamente, fazer isso em uma base caso a caso com as entradas do banco de dados, você pode simplesmente fazê-lo como uma base caso a caso com as páginas.
Você poderia escrever um script perl rápida ou o que você gostaria de gerar essas páginas html para lhe dado o nome de uma página antiga ea URL da nova página.
Você também pode usar um RewriteMap
:
old_page new-page
# …
Mas você precisará definir esse mapa em você httpd.conf (ou configuração de host virutal):
RewriteMap oldtonew txt:/path/to/file/map.txt
Você pode então usar esse mapa em seu arquivo .htaccess:
RewriteCond ${oldtonew:$1} .+
RewriteRule ^(.*)\.html$ /%0.html [L,R=301]