301 перенаправление с PHP и MySQL на 404

Я переношу большой статический веб-сайт с более чем 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 (или даже если это будет, например …) ?

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

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

Самый простой способ, которым я могу думать, – использовать 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», и перенаправляет туда.

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

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

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

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

 old_page new-page # … 

Но вам нужно будет определить эту карту в вашем httpd.conf (или настройке virutal host):

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

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

 RewriteCond ${oldtonew:$1} .+ RewriteRule ^(.*)\.html$ /%0.html [L,R=301]