mod_rewrite для динамического отображения SEO-дружественных ссылок непосредственно на отдельные файлы, без маршрутизации через фронт-контроллер - PullRequest
0 голосов
/ 15 ноября 2010

Я ищу оптимизированное для SEO правило перезаписи URL, которое бы работало на любом обычном PHP-сайте, у которого нет фронт-контроллера. Он будет отображать оптимизированный для SEO URL-адрес непосредственно в файл PHP, который, как обнаружено, существует на сервере, и преобразовывать оставшиеся ветви URL в стандартные параметры URL.

Например:

/ folder1 / folder2 / folder3 / страница / var1 / знач1 / var2 / val2 / var3 / val3

будет соответствовать:

/ folder1 / folder2 / folder3 / page.php? Var1 = val1 & var2 = значение2 & var3 = val3

Теперь вот сложная часть. Поскольку правила перезаписи должны быть полностью независимы от всех имен папок, страниц и переменных, необходимо основывать перезапись параметров URL на точном местоположении по ссылке, где можно найти файл, существующий по пути. Например, рассмотрите, существует ли следующий файл (гипотетически) вне корня документа: / folder1 / folder2.php
В этом случае следующее переопределение будет законным и приемлемым:
/ folder1 / folder2.php? Folder3 = страница & var1 = val1 & var2 = значение2 & var3 = val3

Это будет окончательное правило переписывания для многих уже созданных традиционных веб-сайтов, которые хотят, чтобы их URL-адреса и параметры мгновенно становились дружественными по отношению к URL.

Единственные примеры, которые я обнаружил, включают сопоставление всего для работы с одним фронт-контроллером или иным жестко-закодированным файлом в правиле, которое, как ожидается, будет существовать, вместо того, чтобы mod_rewrite обнаруживал их существование динамически. Они связаны, но не являются гибкими для любого найденного файла:

1 Ответ

1 голос
/ 15 ноября 2010

Веб-сервер Apache уже знает такую ​​концепцию:

  • MultiViews :

    Эффект MultiViewsследующим образом: если сервер получает запрос на /some/dir/foo, если /some/dir имеет включенный MultiViews, а /some/dir/foo не существует, то сервер читает каталог, ища файлы с именем foo. *, и эффективно подделываеткарта типов, которая называет все эти файлы, присваивая им те же типы мультимедиа и кодировки контента, которые были бы у него, если бы клиент запросил один из них по имени.Затем он выбирает лучшее соответствие требованиям клиента.

  • Path Info :

    Эта директива управляет запросами, которыесодержит конечную информацию о путевом имени, которая следует за фактическим именем файла (или несуществующим файлом в существующем каталоге), будет принята или отклонена.Конечная информация об имени пути может быть сделана доступной для сценариев в переменной среды PATH_INFO.

    Например, предположим, что местоположение /test/ указывает на каталог, который содержит только один файл here.html.Затем запросы на /test/here.html/more и /test/nothere.html/more оба собирают /more как PATH_INFO.

Все, что вам затем нужно настроить, это взять часть информации о пути и разобратьit.

Кроме того, если вы действительно хотите реализовать это поведение с помощью mod_rewrite, попробуйте следующее:

RewriteCond %{DOCUMENT_ROOT}/$0.php !-f
RewriteRule ^(.+)/([^/]+)/([^/]+)$ /$1?$2=$3 [N,QSA]
RewriteCond %{DOCUMENT_ROOT}/$0.php -f
RewriteRule .+ /$0.php [L]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...