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

Перенаправление Apache без перенаправления (приложение не будет следовать перенаправлениям)

Недавно нам пришлось переместить / task в / public / task, и я хотел бы настроить Apache для соответствующего перенаправления.

Однако использование mod_rewrite, хотя оно и работает в браузере, похоже, нарушает работу приложений, выполняющих вызовы api в указанное выше место. Что происходит, так это то, что приложение возвращает страницу с сообщением о том, что страница была перемещена, но приложение не выполняет перенаправление.

Итак, есть ли способ просто перенаправить любой трафик на / задачу в / общедоступную / задачу без «перенаправления», т.е. возврата кода состояния перенаправления?


РЕДАКТИРОВАТЬ: Вот еще немного информации. Я нашел простой тест, чтобы выяснить, что я пытаюсь исправить. Вот URL-путь, который нужно перенаправить:

https://mydomain.com/task

Необходимо перейти к:

https://mydomain.com/public/task

Если я использую curl для исходного домена, он просто возвращает уведомление о странице перенаправления. Если я добавлю флаг -L, который сообщает curl о следовании перенаправлениям, он успешно следует за перенаправлением.

Я предполагаю, что нечто очень похожее происходит в приложении (к которому у меня нет доступа), которое вызывает URL-путь / task. Поскольку я не могу изменить приложение, чтобы оно правильно следовало перенаправлениям, я ищу решение, которое я могу реализовать в Apache.


РЕДАКТИРОВАТЬ 2: Спасибо всем за ваш вклад. Предложение Райана использовать флаг [P] при перезаписи сработало. Вот все, что я сделал:

У Apache есть три способа пересылки или перенаправления посетителей на URL-адрес: псевдоним, прокси и перезапись.

Псевдоним кажется наиболее очевидным решением, поскольку он незаметно перенаправляет посетителя в новое указанное место. К сожалению, это не сработало для меня, потому что псевдонимы требуют указания нового местоположения в фактической файловой системе, а с Jboss это местоположение изменяется при каждом повторном развертывании / перезапуске.

Использование ProxyPass также казалось, что это сработает, и, возможно, может, но во всех случаях, когда я его настраивал, curl возвращал пустой результат, и похоже, что что-то не происходит. Вот команда прокси, которую я использовал безрезультатно:

ProxyPass /task http://localhost:8080/public/task

Наконец, перенаправление (с флагом [P]) устранило проблему. Мое первоначальное перенаправление выглядело так:

RewriteRule ^/task/(.*)$ public/task/$1 [R,L]

С помощью [R] Apache возвращал клиенту заголовки перенаправления, что нормально работало в любом браузере, но заставляло такие приложения, как curl, останавливать страницу, которая говорила им о перенаправлении. Curl нужен флаг -L, чтобы затем выполнить перенаправление.

Наконец, используя комбинацию ProxyPass и Rewrite, я смог заставить его работать. Я использовал этот флаг [P] по предложению Райана, и теперь curl будет следовать за перенаправлением без использования флага -L. Моя последняя директива выглядела так:

RewriteRule ^/task/(.*)$ http://localhost:8080/public/task/$1 [P]

Еще раз спасибо всем за помощь!

Я успешно использовал mod_alias, не давая клиенту перенаправления; это было из запрошенного браузером URL / request / во внутренний каталог / opt / myapplication.

Однако, если это решение не работает по какой-либо причине, рассматривали ли вы флаг прокси-сервера mod_rewrite или доверенное лицо настроить? Это тот же сервер, но если псевдоним не работает, прокси может работать на локальном хосте.

Я предполагаю, что вы находитесь на каком-то сервере * nix.

Я могу придумать два подхода, которые могут сработать.

1) символическая ссылка два каталога. ln -s /path/to/domain/public/task /path/to/domain/task Это не строго ответ Apache, но он может выполняться быстрее, чем решение Apache. Тебе понадобится Options FollowSymLinks для конфигурации домена.

2) Псевдонимы Apache Это ответ, опубликованный chultz, поэтому, если вы пойдете с этим, выберите его в качестве решения. Он пришел первым. Для этого вам понадобится mod_alias.

Не зная, какие приложения работают на сервере, вы можете сделать это с помощью Alias. Что-то вроде:

Alias /task /var/www/.../public/task