301 перенаправление с PHP и MySQL на 404 - PullRequest
1 голос
/ 14 апреля 2009

Я переношу большой статический веб-сайт, содержащий более 500 страниц, на установку Joomla, но я хочу вместо того, чтобы кодировать файл с более чем 500-строчным файлом .htaccess, использовать встроенное в PHP перенаправление заголовка 301 для динамического перенаправления запросов. которые приходят на новый URL.

Так, например, после перемещения сайта следующий URL-адрес будет 404 без перенаправления-

http://www.foo.com/old_page.html

Я бы хотел перенаправить на

http://www.foo.com/old-page.php

Итак, я хотел бы создать базу данных MySQL со старыми URL-адресами и соответствующими им новыми URL-адресами, а затем, если сервер собирается вернуть 404, сначала проверить в БД существующий старый URL-адрес и, если он совпадает, выдать 301 перенаправление на новый URL. Хорошо, я здесь понимаю?

Как бы я это сделал? Я могу «говорить» о логике, но не совсем уверен, с чего начать или как ее выполнить, потому что, хотя я понимаю PHP, я не совсем понимаю, как это будет работать с Apache (или даже если это будет, например, ...)

И если вам известны какие-либо сценарии, которые уже делают это, тем лучше.

Ответы [ 4 ]

5 голосов
/ 14 апреля 2009

В вашей конфигурации Apache установите ErrorDocument любого понравившегося вам скрипта /404handler.php. В контексте выполнения $ _ SERVER ['REQUEST_URI'] будет URI запрашиваемой исходной страницы. Выполните поиск в базе данных, и если вы найдете страницу, которую хотите перенаправить, используйте заголовок ("Location:". $ Wherever) для перенаправления на нее.

1 голос
/ 14 апреля 2009

Самый простой способ, который я могу придумать, - это использовать mod_rewrite (ссылка на отличное учебное пособие), чтобы перенаправить ВСЕ входящие запросы в один скрипт PHP (или использовать флаг, чтобы это перенаправило). происходит только в том случае, если запрос направлен на файл, который не существует), причем запрошенный адрес передается как часть строки запроса. Оттуда PHP-скрипт ищет, куда должен идти этот запрос, и перенаправляет на него.

Так что, если кто-то попытается открыть http://www.foo.com/old_page.html,, mod_rewrite отправит что-то вроде http://www.foo.com/redirect.php?page=old_page.html. redirect.php, а затем выполнит поиск в базе данных, чтобы увидеть, какой новый адрес для "old_page.html", и перенаправляет туда.

0 голосов
/ 18 июля 2009

Вы также можете использовать RewriteMap:

old_page new-page
# …

Но вам необходимо определить эту карту в вашем httpd.conf (или в конфигурации виртуального хоста):

RewriteMap oldtonew txt:/path/to/file/map.txt

Затем вы можете использовать эту карту в вашем файле .htaccess:

RewriteCond ${oldtonew:$1} .+
RewriteRule ^(.*)\.html$ /%0.html [L,R=301]
0 голосов
/ 14 апреля 2009

Вместо создания базы данных, почему бы просто не поместить перенаправление на страницу со старым URL (т. Е. Old_page.html)?

Поскольку вы, очевидно, делаете это на индивидуальной основе с записями базы данных, вы можете просто сделать это на индивидуальной основе со страницами.

Вы можете написать быстрый Perl-скрипт или что угодно, чтобы сгенерировать эти HTML-страницы, указав имя старой страницы и URL новой страницы.

...