Модуль 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 (строчные или прописные), цифры, подчеркивания и дефисы. Второй шаблон позволяет любые символы. Из соображений безопасности и отладки обычно лучше использовать шаблон, который ограничивает символы только теми, которые должны быть разрешены. Поэтому я бы пошел с первым из этих шаблонов, добавив дополнительные разрешенные символы, если это необходимо, вместо того, чтобы разрешить все символы.