Модуль Lighttpd mod_rewrite

У меня проблема с модулем mod_rewrite с Lighty.

Я пытаюсь сделать это: example.com/index.php?search=whwhat, появиться как example.com/whwhat или example.com/search/whwhat (еще не решил - не знаю много о SEO)

Хотя я хочу, чтобы он действовал так, как описано выше, я также хочу исключить все физические каталоги и все файлы, такие как каталог /images/ и файлы index.php, favicon.ico, style.css и т. Д., Потому что это действует странно.

Как бы я этого достиг? Я попробовал следующее, которое работало нормально для того, что я хотел, но на самом деле не работало, за исключением каталогов и файлов:

url.rewrite-once = (
"^/([a-zA-Z0-9_-]+)" => "/index.php?search=$1",
"^/(images|js|wp-content)/(.*)" => "$0",
"(.*\.php|.*\.css|favicon.ico)" => "$0" )

Кстати, какая разница между этим:

"^/([a-zA-Z0-9_-]+)" => "/index.php?search=$1",

И это:

"^/(.*)$" => "/index.php?search=$1"

1 ответ

Решение

Чтобы избежать необходимости добавлять многочисленные директивы RewriteCond, проверяющие, что запрос посетителя не является реальным файлом, а не искусственным путем, я рекомендую перейти с /search/whatever картина в пользу /whatever шаблон. Затем, до тех пор, пока вы никогда не создадите реальный каталог с именем "search", вам никогда не понадобится проверять, начинается ли путь с /search фактический путь к файлу Таким образом, ваш RewriteRule становится таким простым:

RewriteRule ^/search/([a-zA-Z0-9_-]+)$ /index.php?search=$1

(Я не знаком с Lighty, поэтому не знаю, как перевести это в инструкцию url.rewrite-Once, но это такая простая перезапись, что она должна быть простой.)

Однако браузер посетителя теперь будет думать, что он просматривает страницу, которая находится в подкаталоге, называемом "поиск", поэтому, если у вас есть какие-либо элементы изображения или файлы CSS, указанные с относительными путями (пути, не привязанные к корневому каталогу), например, как src="images/photo.jpg" или же href="stylesheets/clean.css" тогда браузер будет думать, что эти пути относятся к каталогу "search", и запрашивает у вашего веб-сервера /search/images/photo.jpg а также /search/stylesheets/clean.css соответственно.

Есть два способа сделать это. Первый - изменить все пути оформления страницы (изображения, таблицы стилей, JavaScript) на абсолютные. То есть измените путь так, чтобы он начинался с косой черты, которая представляет корневой каталог веб-сайта. Таким образом, ваш путь к изображению должен быть изменен на src="/images/photo.jpg" и ваш путь к таблице стилей href="/stylesheets/clean.css", Косая черта в начале указывает веб-браузеру, что путь начинается с корневого каталога сайта, поэтому двусмысленности нет.

Второй вариант - создать замысловатые RewriteRules для перенаправления запросов на изображения, таблицы стилей, файлы сценариев и т. Д. В правильные каталоги. Это имеет тенденцию становиться уродливым и хрупким, если у вас много типов мультимедиа в разных каталогах, и вам нужно, чтобы они работали из множества разных подкаталогов (виртуальных и / или других).

Какой вариант вы выберете, зависит от ваших требований и предпочтений.

Что касается вашего вопроса о разнице между [a-zA-Z0-9_-]+ а также .* первый шаблон допускает только буквы от a до z (строчные или прописные), цифры, подчеркивания и дефисы. Второй шаблон позволяет любые символы. Из соображений безопасности и отладки обычно лучше использовать шаблон, который ограничивает символы только теми, которые должны быть разрешены. Поэтому я бы пошел с первым из этих шаблонов, добавив дополнительные разрешенные символы, если это необходимо, вместо того, чтобы разрешить все символы.

Другие вопросы по тегам