Назад | Перейти на главную страницу

Почему Apache игнорирует мое правило перезаписи?

У меня есть старое приложение с URL-адресами вида ...

http://apps.myserver.com/appname/viewItem.akt?p=123

Я заменяю это старое приложение тем, у которого есть URL-адреса вроде ...

http://appname.myserver.com/item/123

Я пробовал добавить несколько разных правил перезаписи в httpd/httpd.conf и перезапускаю сервер, но я продолжаю получать 404 ошибки.

Я пробовал пару вещей ...

RewriteEngine on

RewriteRule ^.*viewItem.akt\?p=([0-9]*)$ http://appname.myserver.com/item/$1 [R]

Или...

RewriteRule ^/appname/viewItem.akt\?p=([0-9]*)$ http://appname.myserver.com/item/$1 [R]

Результатом всегда будет «Запрошенный URL /appname/viewItem.akt не найден на этом сервере», как если бы правила перезаписи даже не было.

В журнале доступа я получаю ...

[IP address] - - [09/Sep/2011:21:27:37 -0700] "GET /appname/viewItem.akt?p=1018 HTTP/1.0" 404 248

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

Что мне не хватает?


Если это актуально, старое приложение было Java-приложением, работающим под Tomcat, и у меня был настроен ProxyPass вот так ...

(Я показываю эти строки закомментированными, как когда я пытаюсь заставить правило перезаписи работать.)

# ProxyPass /appname http://apps.myserver.com:8080/appname
# ProxyPassReverse /appname http://apps.myserver.com:8080/appname

Но это не имеет значения, правда? Пока мое правило перезаписи соответствует запросу, оно должно правильно его отправлять, не так ли?

Попробуй это:

RewriteEngine on
RewriteCond %{QUERY_STRING} ^p=([0-9]+)$
RewriteRule ^appname/viewItem.akt$ http://appname.myserver.com/item/%1? [R,L]
  • %1 вернуться к ссылке на Rewrite Condition
  • ? в конце подстановки, чтобы удалить оставшуюся часть строки запроса

Но похоже ты путаешься mod_rewrite с участием mod_proxy. Какая версия Apache у вас установлена?

Не знаю, подходит ли это тебе, но меня это тоже сводит с ума. Я всегда стараюсь максимально упростить.

В моих тестах это работает:
RewriteRule p=([0-9]*)$ http://appname.myserver.com/item/$1

Ты уверен что mod_rewrite правильно загружается?

В противном случае с помощью директивы RewriteLog с согласно RewriteLogLevel должен помочь вам выяснить, учитывается ли ваше RewriteRule при запросе вашей страницы, и совпадает ли регулярное выражение или нет.