htaccess перезаписывает URL-адреса без общего шаблона

#.htaccess #rewrite

#.htaccess #url-перезапись

Вопрос:

В новом проекте веб-сайт имеет набор статических HTML-страниц. Владельцу необходимо преобразовать их в динамические. На каждой странице есть: текстовый раздел, небольшая фотография плюс несколько ссылок на другие страницы, связанные с этой.

Все это я могу поместить в базу данных и создать динамическую страницу (php).

Моя проблема в том, что каждая статическая страница уникальна — в URL нет общего шаблона. И на данный момент таких страниц 860. У меня может быть один URL, подобный:

 folder1/folder2/item1.htm
folder1/folder2/folder3/item2.htm
folder1/folder2/folder2-fodler3/item3.htm
  

На данный момент эти 3 шаблона являются наиболее распространенными (обслуживают около 650 URL-адресов из 860).

Имя каждой папки на самом деле является категорией / подкатегорией / ключевым словом, которое я могу использовать для определения свойств моего элемента. Как правило, первые 2 папки (folder1 и folder2) представляют собой категорию и подкатегорию продукта, в то время как следующие папки (папка 3 и после нее) определяют раздел (если таковой имеется) товара. Я надеюсь, что это имеет смысл.

Итак, одна из идей состоит в том, чтобы использовать старый, статический URL-адрес в качестве файла базы данных и сопоставить его для обслуживания содержимого, что-то вроде:

 RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule (.*) /script.php?path=$1 [L]
  

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

Целесообразен ли такой подход? ИЛИ есть другой способ? Что-то более надежное / безопасное / легкое?

Комментарии:

1. По вашему описанию файлы выглядят небольшими и относительно хорошо структурированными. Более долгосрочным решением может быть синтаксический анализ файлов, сохранение значений в базе данных и предоставление данных на динамической странице. Это сделало бы все это действительно динамичным, то есть содержимое и презентацию было бы легко изменить. (Я только что увидел, что это не совсем новый вопрос. В любом случае)

Ответ №1:

Метод, который вы описываете, довольно распространен и хорошо:

 RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule (.*) /script.php?path=$1 [L]
  

Вы можете упростить задачу, проанализировав исходную строку запроса напрямую в вашем PHP-скрипте, что является более прямым. Посмотрите, что предлагает ваш сервер в $_SERVER суперглобальном массиве PHP, например run var_dump($_SERVER); . Вы уже нашли что-то похожее на ваше, $_GET['path'] которое вы используете, это, как правило, более совместимо:

 RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule (.*) /script.php [L]
  

Далее, в зависимости от версии сервера apache, это может быть дополнительно упрощено как:

 FallbackResource /script.php
  

Это избавляет вас от дополнительной проверки файла, который RewriteCond вы используете в данный момент.

Ответ №2:

Просто используйте

 RewriteEngine on
RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^/script.php?path=$1 [L]
  

Комментарии:

1. У этого правила перезаписи нет цели (если только вы не хотите переписать URI на [L] )