На самом деле mod_rewrite ... не переписывает URL - PullRequest
0 голосов
/ 15 октября 2011

По сути, я пытался создать несколько дружественных 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, но это то, что мне нужно изучить.

ура!

Ответы [ 3 ]

0 голосов
/ 15 октября 2011

Измените [L] на [R, L] для принудительного фактического перенаправления HTTP. В противном случае он просто выполняет внутреннюю перезапись (когда это возможно), что влияет только на отображение из URI в файловую систему. (См. Описание флага [R] на http://httpd.apache.org/docs/current/mod/mod_rewrite.html#rewriteflags.)

0 голосов
/ 15 октября 2011

Ваша конфигурация в настоящее время такова:

RewriteEngine On
RewriteBase /
RewriteRule ^profile.php?user=$1 ^profile/user/([^/]*)/$ [L]

В RewriteRule вы меняли параметры с и на .

Предполагая, что на вашем сервере есть структура каталогов, подобная этой:

/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 запроса и Строка запроса . mod_rewrite будет использоваться только URI запроса. Поэтому вы должны обрабатывать строку запроса отдельно.
  • Я ограничил имя пользователя только [A-Za-z0-9_]. Если бы я разрешил все символы, злоумышленник мог бы легко позвонить /profile.php?user=../../config.php, который был бы переписан на profile/user/../../config.php, и вы, вероятно, не захотели бы поделиться этим файлом с миром.
  • Аргументы директивы RewriteRule совершенно разные в отношении их синтаксиса.
    • Первый аргумент (часть из ) является регулярным выражением, которое обычно начинается с каретки ^ и заканчивается долларом $.
    • Второй аргумент (часть от до ) - это замена, представляющая собой почти простую строку с некоторыми специальными функциями. Эта строка обычно не начинается с каретки, но выглядит скорее как путь.
0 голосов
/ 15 октября 2011

Неправильно.

            ## rewriting from           to
RewriteRule ^profile.php?user=$1 ^profile/user/([^/]*)/$ [L]

Должно быть

            ## rewriting from           to
RewriteRule ^profile/user/([^/]+)$ profile.php?user=$1  [L]
...