301 перенаправление с PHP и MySQL на 404
-
09-09-2019 - |
Вопрос
Я переношу большой статический веб-сайт из более чем 500 страниц на установку Joomla, но то, что я хочу сделать, вместо того, чтобы кодировать файл .htaccess объемом более 500 строк, - это использовать встроенное в 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'] $_SERVER['ЗАПРОС_УРИ'] будет являться URI исходной запрошенной страницы.Выполните поиск в базе данных, и если вы найдете страницу, которую хотите перенаправить, используйте заголовок ("Местоположение:" .$где бы то ни было) чтобы перенаправить на него.
Другие советы
Самый простой способ, который я могу придумать, - это использовать 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 (или конфигурации виртуального хоста):
RewriteMap oldtonew txt:/path/to/file/map.txt
Затем вы можете использовать эту карту в своем файле .htaccess:
RewriteCond ${oldtonew:$1} .+
RewriteRule ^(.*)\.html$ /%0.html [L,R=301]