Очистите URL-адреса с помощью mod_rewrite и сохраните корневой путь для включения (js и css)

Установка: у меня есть обычный веб-сервер Unix с Apache и PHP. Он обслуживает PHP-скрипты, как и ожидалось.

Текущая ситуация: Все мои ссылки выглядят как типичные ссылки PHP с параметрами website.net/index.php?show=article&do=new

Что мне нужно: правило mod_rewrite для переназначения моих URL, независимо от того, как они выглядят или содержат.

Например: website.net/article/new должен перенаправлять на index.php, а $_SERVER['REQUEST_URI'] должен содержать /article/new/ и т. д., но не ограничиваться этим и не иметь фиксированного шаблона (*n переменных), вся остальная работа выполняется с помощью PHP (проверка, в том числе).

Мои усилия до сих пор: много пользовался Google и перепробовал множество примеров. но нашел только некоторые с фиксированными шаблонами, а некоторые даже сломали весь сайт.

Другая проблема: во время экспериментов с mod_rewrite я заметил, что он сломал путь к моим файлам js и css. Я использую относительные пути, они находятся в подпапке относительно index.php

<script src="js/included_file.js"></script>

<link href="css/included_file.css" rel="stylesheet"">


person mazer    schedule 11.09.2013    source источник


Ответы (1)


Вы можете использовать -f RewriteCondition для исключения файлов:

RewriteCond %{REQUEST_FILENAME} !-f          #exclude files
RewriteRule ^(.*) index.php?__path=$1 [QSA]  #catch everything

Если вы хотите сохранить каталоги, вы можете сделать это с помощью -d.

Теперь, если вы позвоните по URL-адресу:

website.net/path/to/file?query=string&foo=bar

Вы получите (в вашем $_GET):

__path = "/path/to/file"
query = "string"
foo = "bar"

Не используйте $_REQUEST. Он нестандартен и смешивает $_GET и $_POST, это может привести к очень странным багам.

person Halcyon    schedule 11.09.2013
comment
Извините, моя ошибка, $_REQUEST следует читать $_SERVER['REQUEST_URI']. Цель состояла в том, чтобы избавиться от $_GET. Попробую ваше решение как можно скорее - person mazer; 11.09.2013
comment
Нет смысла избавляться от $_GET, как и от $_POST, вы должны использовать его. Одна вещь, которую вы можете сделать (и я рекомендую это): в начале вашего скрипта извлеките все необходимые данные из $_GET и $_SERVER и никогда больше не используйте эти глобальные переменные. Это просто хороший архитектурный дизайн. - person Halcyon; 11.09.2013
comment
Под избавлением я подразумеваю скорее скрытие от глаз пользователей. Меня вполне устраивает использование и доступ к ним, например $_GET["__path"] из вашего решения. в начале моего скрипта я действительно использую механизм проверки и дезинфекции ввода и сохранения их в отдельном массиве :) - person mazer; 11.09.2013
comment
Вы можете отказаться от использования QueryString. В этом случае вы можете не устанавливать флаг [QSA] (QueryStringAppend). Это означает, что вы никогда не увидите дополнительных $_GET параметров, даже если они будут переданы. - person Halcyon; 11.09.2013
comment
Протестировал ваше решение, и оно сработало для первого уровня иерархии папок. website.net/articles/ работает нормально, но website.net/atricles/new сломает дизайн из-за отсутствия файлов css и js. Есть ли способ исправить это с помощью mod_rewrite или мне следует использовать абсолютный URL-адрес файлов? я также исключил каталоги с -d - person mazer; 11.09.2013
comment
О, да, не используйте относительные URL-адреса. Измените на /js/included_file.js, и все должно быть в порядке. - person Halcyon; 11.09.2013