Что не так с этим регулярным выражением в файле .htaccess? - PullRequest
1 голос
/ 14 марта 2011

Я пытаюсь понять, почему это регулярное выражение не работает в моем файле .htaccess.Я хочу, чтобы каждый раз, когда пользователь переходил на job_wanted.php?jid=ID, он переходил на job/ID.

Что с этим не так?

RewriteEngine On

RewriteCond %{QUERY_STRING} jid=([0-9]+)
RewriteRule ^job_wanted\.php?$ job/%1? [R]

Я хочу, чтобы, когда пользовательнажимает http://localhost/jobwehave.co.za/jobs/ID, они показывают те же результаты, что и показанные ниже: http://localhost/jobwehave.co.za/jobs?id=ID.

Извините за перепутывание.Я все еще очень смущен тем, как это работает.

Ответы [ 7 ]

2 голосов
/ 14 марта 2011

Основная проблема заключается в том, что вы не можете сопоставить строку запроса как часть RewriteRule. Вам нужно переместить эту часть в оператор RewriteCond.

RewriteEngine On
RewriteCond %{QUERY_STRING} jid=([0-9]+)
RewriteRule ^job_wanted\.php$ /job/%1?

Редактирование, чтобы отразить ваш обновленный вопрос, который противоположен тому, что я показал здесь. И наоборот, чтобы преобразовать /job/123 в то, что может потреблять ваш PHP-скрипт, вам понадобится:

RewriteEngine On
RewriteRule ^/job/([0-9]+)$ /path/to/job_wanted.php?jid=$1

Но у вас, вероятно, возникнут проблемы с тем, чтобы поместить это в файл .htaccess где угодно, кроме корня, и, возможно, даже там. Если он работает в корне, вам, вероятно, придется удалить ведущий / из RewriteRule, который я здесь показываю.

Второе изменение, чтобы отразить ваш комментарий: я думаю, что вы хотите, это сложно, но это может сработать:

RewriteEngine On
RewriteRule ^/job/([0-9]+)$ /path/to/job_wanted.php?jid=$1 [L]

RewriteCond %{QUERY_STRING} jid=([0-9]+)
RewriteRule ^job_wanted\.php$ http://host.name/job/%1? [R]

Ваша основная проблема заключается в том, что вы хотите «исправить» существующие ссылки, предположительно, вне вашего контроля. Чтобы изменить URL-адрес в адресной строке браузера, необходимо перенаправить браузер. Другого способа сделать это нет.

Вот что делает второе правило cond +: оно сопоставляет входящие старые URL-адреса и перенаправляет их в ваш красивый формат URL-адреса. Это либо должно быть в конфигурационном блоке VirtualHost, либо в файле .htaccess в том же каталоге, что и ваш PHP-скрипт.

Первое правило действует противоположным образом: оно преобразует красивый URL обратно во что-то, что может использовать Apache, но оно делает это с помощью внутреннего подзапроса, который, надеюсь, не вызовет еще один раунд переписывания. Если это так, у вас есть бесконечный цикл. Если это работает, это вызовет ваш PHP-скрипт с параметром строки запроса для идентификатора задания, и ваша страница будет работать как обычно. Обратите внимание, что поскольку в этом правиле предполагается другой, возможно, несуществующий путь к файловой системе, оно должно указываться в блоке VirtualHost или в файле .htaccess в корне сайта, т. Е. в другом месте .

Распространение конфигурации по разным местам звучит как рецепт для будущих проблем для меня, и я не рекомендую это. Я думаю, вам лучше поменять ссылки под вашим контролем на красивые версии и не беспокоиться о других ссылках.

1 голос
/ 14 марта 2011

Что-то вроде

ReWriteRule ^job\_wanted\.php\?jid\=([0-9-]+)$ /job/$1

должен сделать трюк.

1 голос
/ 14 марта 2011

^ привязывает регулярное выражение в начале строки.

RewriteRule сопоставляет URI , начиная с , с / (если только оно не находится в некоторой конфигурации для каждого каталога).область).

Либо добавьте префикс /, либо удалите якорь ^ (в зависимости от того, чего вы хотите достичь)

1 голос
/ 14 марта 2011

Вы не захватили идентификатор задания в регулярном выражении, поэтому вы не можете ссылаться на него в переписанном URL. Примерно так (не проверено, будьте бдительны, может вызвать желудочное расстройство и т. Д.):

RewriteRule ^job/([0-9]+) job_wanted.php?jid=$1

См. Начните переписывать для учебника по этому вопросу.

1 голос
/ 14 марта 2011

Вам нужно экранировать отметки ? и ., если вы хотите, чтобы они были литералами.

^job_wanted\.php\?jid=9\?$

Но хотя это объясняет, почему ваш шаблон не соответствует, он не решает проблему перезаписи вашего URL. Я также не уверен, почему вы хотите, чтобы ^ и $ были там, поскольку это не позволит ему сопоставить большинство URL-адресов (например, http://www.yoursite.com/job_wanted.php?jid=9 не будет работать, потому что он не начинается с job_wanted. PHP).

Я плохо знаю htaccess, поэтому могу ответить только на часть вашего вопроса, касающуюся регулярных выражений. В традиционном синтаксисе регулярных выражений вы должны искать что-то вроде этого:

s/job_wanted\.php\?jid=(\d*)/job\/$1/i

Надеюсь, это поможет.

1 голос
/ 14 марта 2011

Символы ? и . имеют особое значение в регулярных выражениях. Вам, вероятно, просто нужно сбежать от них.

Также вам нужно захватить значение jid и использовать его в правиле.

Попробуйте изменить свои правила на это:

RewriteEngine On
RewriteRule ^job_wanted\.php\?jid=([0-9]+)$ /job/$1
1 голос
/ 14 марта 2011

Вы пытались экранировать специальные символы (например, ?)?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...