#.htaccess #mod-rewrite
#.htaccess #mod-переписать
Вопрос:
В принципе, я пытался создать несколько удобных URL-адресов через .htaccess, используя mod_rewrite — и мне удалось заставить его работать … но только с такими базовыми вещами, как:
RewriteEngine On
RewriteBase /
RewriteRule ^profile.php http://www.google.co.uk [L]
Итак, mod_rewrite работает, и я могу перенаправлять на другие сайты, другие файлы / каталоги на моем сервере и т. Д. — Но, похоже, это не работает, когда я использую это:
RewriteEngine On
RewriteBase /
RewriteRule ^profile.php?user=$1 ^profile/user/([^/]*)/$ [L]
Любая помощь по этому вопросу была бы отличной, поскольку я в значительной степени отстой в mod_rewrite, но это то, чему мне нужно научиться.
Приветствия!
Ответ №1:
Измените [L] на [R,L], чтобы принудительно перенаправить фактический HTTP. В противном случае он просто выполняет внутреннюю перезапись (когда это возможно), что влияет только на сопоставление URI с файловой системой. (Смотрите описание флага [R] в http://httpd.apache.org/docs/current/mod/mod_rewrite.html#rewriteflags .)
Ответ №2:
Неправильно.
## rewriting from to
RewriteRule ^profile.php?user=$1 ^profile/user/([^/]*)/$ [L]
Должно быть
## rewriting from to
RewriteRule ^profile/user/([^/] )$ profile.php?user=$1 [L]
Комментарии:
1. Я же говорил, что я n00b. 😛 Кроме того, это все еще не работает для меня, что раздражает.
2. @Matt: к какому URL-адресу вы пытаетесь получить доступ?
3. Я пытаюсь перенаправить с: profile.php?user={USERNAME} на: /profile/user/{USERNAME]
4. @Matt: и к какому URL-адресу вы пытаетесь получить доступ?
5. Правильно. Я хочу, чтобы при переходе браузера к «profile.php?user={USERNAME}» вместо того, чтобы видеть этот URL-адрес в браузере, они видели «/profile/users/{USERNAME}».
Ответ №3:
Ваша конфигурация в настоящее время такова:
RewriteEngine On
RewriteBase /
RewriteRule ^profile.php?user=$1 ^profile/user/([^/]*)/$ [L]
В RewriteRule
вы поменяли местами параметры from и to .
Предполагая, что на вашем сервере существует структура каталогов, подобная этой:
/var/www/htdocs/profile/user/albert
/var/www/htdocs/profile/user/bob
Затем вы можете использовать следующее правило:
RewriteCond ${QUERY_STRING} ^user=(w )$
RewriteRule ^profile.php$ profile/user/%1 [L]
Есть некоторые моменты, которые вы здесь неправильно поняли:
- Запрос на «/profile.php?user=bob» сначала разбивается на URI запроса и строку запроса. Будет использоваться только URI запроса
mod_rewrite
. Поэтому вам придется обрабатывать строку запроса отдельно. - Я ограничил только имя пользователя
[A-Za-z0-9_]
. Если бы я разрешил все символы, злоумышленник мог бы легко вызвать/profile.php?user=../../config.php
, который будет перезаписанprofile/user/../../config.php
, и вы, вероятно, не захотите делиться этим файлом с миром. - Аргументы
RewriteRule
директивы полностью отличаются в отношении их синтаксиса.- Первый аргумент (часть from ) — это регулярное выражение, которое обычно начинается с символа каретки
^
и заканчивается долларом$
. - Второй аргумент (часть to) — это замена, которая представляет собой почти простую строку с некоторыми специальными функциями. Эта строка обычно не начинается с каретки, а выглядит скорее как имя пути.
- Первый аргумент (часть from ) — это регулярное выражение, которое обычно начинается с символа каретки