mod_rewrite на самом деле этого не делает… переписать URL-адрес

#.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) — это замена, которая представляет собой почти простую строку с некоторыми специальными функциями. Эта строка обычно не начинается с каретки, а выглядит скорее как имя пути.