mod_rewrite возвращает 302 найдено

У меня апач 2.2 и я использую mod_rewrite. Моя цель — перенаправить трафик с http://localhost:80/AA на http://localhost:8090/BB. Итак, у меня есть простое правило

Правило перезаписи http://localhost:80/AA http://localhost:8090/BB

Моя проблема в том, что клиент получает "302 Found". Я надеялся, что RewriteRule перенаправит трафик от AA к BB, и, наконец, BB отправит ответ моему клиенту.

Есть ли проблема с моей конфигурацией?


person cateof    schedule 07.11.2010    source источник
comment
Я предполагаю, что здесь задействованы либо два разных веб-сервера, один прослушивает 80, а другой прослушивает 8090, либо у вас есть Apache, прослушивающий эти 2 порта с 2 разными виртуальными хостами?   -  person    schedule 07.11.2010
comment
сервер tomcat расположен по адресу localhost:8090/BB. Однако я не хочу, чтобы мой клиент изменил URL-адрес. Поэтому я установил apache, чтобы использовать возможности mod_rewrite и отправлять трафик с порта 80 t0 8090. Я не знаю, является ли это оптимальным решением...   -  person cateof    schedule 07.11.2010
comment
Кажется, я запутался в вашем вопросе. Когда вы используете mod_rewrite для перенаправления с одного хоста на другой, вы получите два ответа, отправленных в ваш браузер. Первый — 302, который указывает браузеру перейти на второй URL-адрес. Второй ответ должен быть 200. Редирект работает, кроме кодов ответов?   -  person bmb    schedule 07.11.2010
comment
@бмб. Большое спасибо, что вы нашли время, чтобы ответить. Я думал, что с mod_rewrite у меня будет только один HTTP-ответ. Если я беру 2, т.е. 301 и 200 ОК, эта модель мне не подходит. Есть ли у вас какие-либо предложения о том, как это сделать? Как сделать AA псевдонимом с BB< /а>?   -  person cateof    schedule 07.11.2010
comment
Я добавил больше информации к своему ответу, но краткий ответ: я не думаю, что вы можете делать то, что хотите, используя только mod_rewrite и текущую настройку.   -  person bmb    schedule 08.11.2010


Ответы (3)


Левая сторона или шаблон вашего RewriteRule должен быть просто именем файла, которое вы хотите сопоставить, например. ^/AA$. Если вы также хотите убедиться, что хост и порт соответствуют определенным значениям, вы должны настроить RewriteCond так, чтобы они соответствовали %{HTTP_HOST} и %{SERVER_PORT}. Однако последнее может быть ненужным, если только ваш веб-сервер не настроен для нескольких доменов и портов.

Это не проверено, но что-то вроде этого:

RewriteCond %{HTTP_HOST}   ^localhost
RewriteCond %{SERVER_PORT} ^80$
RewriteRule ^/AA$          http://localhost:8090/BB

Я бы порекомендовал вам сначала попробовать это:

RewriteRule ^/AA$          http://localhost:8090/BB

и добавьте RewriteCond, если они вам нужны.

Редактировать на основе комментариев: если вы пытаетесь избежать ответа "302", вы не можете сделать это в описанной вами ситуации. Когда вы используете mod_rewrite для перенаправления с одного хоста на другой, вы получите два ответа, отправленных в ваш браузер. Первый — 302, который указывает браузеру перейти на второй URL-адрес. Второй ответ должен быть 200.

С помощью mod_rewrite вы можете избежать перенаправления посередине, если переписывание происходит с одной страницы на другую на тот же сервер и порт. В этом случае перезапись является внутренней, и веб-сервер может ответить страницей BB, даже если запрос предназначен для AA. Если вы используете другой сервер или порт, веб-сервер для AA не имеет доступа к странице BB, поэтому он отвечает перенаправлением на сервер, у которого есть доступ.

Если вы можете перенастроить свой сайт для использования одного и того же порта для AA и BB, вы сможете заставить его работать. Если нет, я думаю, вы сможете делать то, что хотите, с mod_proxy. Я никогда не использовал mod_proxy, поэтому я не уверен, что вам нужно сделать.

person bmb    schedule 07.11.2010
comment
Я использовал только ваше RewriteRule и добавил [R=permanent,L] в конце строки. В результате клиенту была отправлена ​​ошибка 301. То, что я хочу, это правило для пересылки с AA на BB, а затем сервер на 8090 отправит обратно http 200 OK моему клиенту. - person cateof; 07.11.2010
comment
Страница ББ на 8090 успешно отображается? Если так, то он работает. :80 отправляет перенаправление 301 или 302, а затем 8090 отправляет 200. Вы не можете избежать 301 в середине, когда вы перенаправляете с одного сервера на другой с помощью mod_rewrite. - person bmb; 07.11.2010
comment
проблема с mod_proxy заключается в том, что вы не можете использовать символ вопросительного знака в URL-адресе подстановки. Например, foo.example.com/bar?lala будет жаловаться, потому что ?lala считается строкой запроса. Это проблема с mod_proxy – cateof 0 сек. назад - person cateof; 09.11.2010

См. документацию по RewriteRule.

Что вы хотите сделать, так это добавить флаг R в свое правило для перенаправления.

RewriteRule http://localhost:80/AA http://localhost:8090/BB [R=permanent,L]

L для последнего правила.

person Kissaki    schedule 07.11.2010
comment
Вы проверили возвращенные заголовки? Например. в Firefox с помощью Firebug (или аналогичного в других браузерах) на вкладке «Сеть». Проверьте возвращенные заголовки (местоположение и код состояния HTTP). Итак, он перенаправляет вас на 404 или возвращает 404 на первой запрошенной странице? - person Kissaki; 08.11.2010

Если вы хотите перенаправить трафик, я думаю, mod_rewrite не сможет этого сделать. Предпочтительно использовать mod_proxy: http://httpd.apache.org/docs/2.0/mod/mod_proxy.html#proxypassreverse

Пример из документации:

ProxyRequests Off

<Proxy *>
   Order deny,allow
  Allow from all
</Proxy>

ProxyPass /foo http://foo.example.com/bar
ProxyPassReverse /foo http://foo.example.com/bar
person Romuald Brunet    schedule 08.11.2010
comment
проблема с mod_proxy заключается в том, что вы не можете использовать символ вопросительного знака в URL-адресе подстановки. Например, foo.example.com/bar?lala будет жаловаться, потому что ?lala считается строкой запроса . Это проблема с mod_proxy - person cateof; 09.11.2010
comment
Как в документации Apache для директивы ProxyPass: Если вам требуется более гибкая конфигурация обратного прокси, см. директиву RewriteRule с флагом [P]. Поэтому попробуйте установить флаг [P] после RewriteRule, и это пропустит код ответа 302 Found. - person kolyaseg; 28.06.2016