У меня очень неприятная проблема с правилами перезаписи в файле .htaccess
.
Контекст
Итак, я хочу, чтобы эти два типа URL-адресов переписывались для разных целей:
URL 1 -- http://example.com/rem/call/answer/{Hex String}/{Hex String}/
URL 2 -- http://example.com/answer/{Hex String}/{Hex String}/
Это выдержка из моего файла .htaccess:
RewriteEngine On
RewriteRule rem/call/answer/([a-f0-9]+)/([a-f0-9]+)/?$ /TARGET1
RewriteRule answer/([a-f0-9]+)/([a-f0-9]+)/?$ /TARGET2
Проблема
Теперь проблема в том, что URL 2 хорошо переписывается (с использованием правила #2) и переходит к TARGET 2, но URL 1 strong> перезаписывает оба правила, а не только правило №1.
Я попробовал несколько решений, в том числе очевидное использование символа ^
для начала строки. На тот момент мои правила перезаписи были такими:
RewriteEngine On
RewriteRule rem/call/answer/([a-f0-9]+)/([a-f0-9]+)/?$ /TARGET1
RewriteRule ^answer/([a-f0-9]+)/([a-f0-9]+)/?$ /TARGET2
Однако случилась другая проблема. На этот раз это URL 1, который хорошо переписывается, только с правилом #1 и переходит к TARGET 1. Но теперь URL 2 вообще больше не перезаписывается. Я предполагаю, что это потому, что второе правило перезаписи никогда не соответствует никакому URL-адресу и, следовательно, никогда не применяется.
Единственное решение, которое я нашел до сих пор, это удалить ^
и использовать флаг [L]
в конце правила №1, например так:
RewriteEngine On
RewriteRule rem/call/answer/([a-f0-9]+)/([a-f0-9]+)/?$ /TARGET1 [L]
RewriteRule answer/([a-f0-9]+)/([a-f0-9]+)/?$ /TARGET2
Таким образом, он использует правило № 1, соответствует, но никогда не достигает правила № 2. Оба URL-адреса правильно переписываются с этими правилами, но это не очень хорошее решение, так как я, возможно, не захочу останавливать перезапись URL 1 после применения первого правила (что, если у меня есть третье правило, я бы тоже хочу к ней обратиться...)
Мои вопросы к вам
Теперь, когда я изложил проблему, мои вопросы:
- Является ли флаг
[L]
единственным выходом? (в чем я очень сомневаюсь и, конечно, надеюсь, что нет) - Будет ли
^
подходящим решением? (Я так думаю) - Если да, то как заставить его работать и почему он вообще не работает в моем случае?
Что я подозреваю
Я подозреваю, что это как-то связано с тем фактом, что URL-адрес на самом деле http://example.com/answer/{Hex String}/{Hex String}/
, а не просто answer/{Hex String}/{Hex String}/
, что означает, что answer/..
на самом деле не находится в начале строки, и, таким образом, префикс ^
не работает.
Но тогда это подводит меня к другому вопросу:
Как указать apache удалить URL-адрес части схемы + домена (например, http://example.com/
) и сопоставить правила только с остальной частью URL-адреса (например, answer/{Hex String}/{Hex String}/
)?
РЕДАКТИРОВАТЬ
Я также должен добавить, что я пробовал базовый пример Алисы-Боба. У меня есть файл с именем bob.html в моем корне и следующее правило в моем файле .htaccess
:
RewriteRule alice.html$ /bob.html
Это прекрасно работает и отображает страницу bob.html при запросе alice.html. Однако, если я изменю правило на:
RewriteRule ^alice.html$ /bob.html
Затем я получаю ошибку 404 при запросе страницы alice.html...
Что касается комментария @anubhava, мой полный файл .htaccess составлен следующим образом:
RewriteEngine On
[A bunch of RewriteRule that have nothing to do with the topic at hand
(don't contain any "answer" string in them and all work perfectly)]
RewriteRule rem/call/answer/([a-f0-9]+)/([a-f0-9]+)/?$ /TARGET1 [L]
RewriteRule answer/([a-f0-9]+)/([a-f0-9]+)/?$ /TARGET2
ErrorDocument 404 /404.html
Header set Access-Control-Allow-Origin "*"
SetEnv file_uploads On
answer
. ДЛЯ примера:RewriteRule ^answer/(.*)$ /some/path/answer/foo.php
? Появляется ли строковый ответ в цели вашего правила? - person Jon Lin   schedule 03.09.2015"answer"
. А у второго что-то вроде"redirect-answer.php?..."
. Так что я действительно думаю, что проблема исходит откуда-то еще. Где вы думаете о каком-то закольцованном переписывании? - person Dolma   schedule 03.09.2015redirect-answer.php
(цель 2). И файл.htaccess
находится в корневом каталоге выше моего каталогаwww
. Меня до сих пор беспокоит, почему даже простой тест Алисы-Боба не сработал... - person Dolma   schedule 03.09.2015RewriteRule ^alice.html$ /bob.html
должно работать. Разве он не должен находиться в каталогеwww
? - person anubhava   schedule 03.09.2015.htaccess
, и я прочитал в Интернете, что я должен поместить его надwww
. До сих пор все работало хорошо, поэтому я не сомневался в этом. Я только что попытался переместить его в каталогwww
, и^
теперь работает как шарм. Я чувствую себя действительно глупо ^^ Что ж, проблема решена, большое спасибо! - person Dolma   schedule 04.09.2015