Вопрос

Я переношу большой статический веб-сайт из более чем 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]
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top