Rails: ActiveResource и Apache Redirect

У меня есть приложения rails, которые взаимодействуют друг с другом с помощью ActiveResource. Я настроил VHOST для перенаправления каждого HTTP-запроса на HTTPS. Это VHOST для одного приложения:

<VirtualHost *.80>
 <Location />
    Redirect permanent / https://my.app.com/
 </Location>
</VirtualHost>

#http requests will forwarded here by the above Redirect
<VirtualHost *.443>

 ....
</VirtualHost>

Это перенаправляет поиск при доступе через браузер, но когда я отправляю HTTP-запрос через ActiveResource, он возвращает ошибку: перемещено навсегда. Я понимаю, что это может произойти в приведенной выше настройке, но как справиться с этой ситуацией и заставить ActiveResource работать, даже если он отправляет запрос на HTTP (должен быть перенаправлен на HTTPS)?

Спасибо,

Имран


person Saim    schedule 21.12.2010    source источник


Ответы (2)


Rails не может автоматически перенаправлять вызовы ActiveResource, поскольку только запросы GET и HEAD могут быть автоматически перенаправлены в соответствии с спецификация HTTP.

Таким образом, перенаправление с сервера приведет к возникновению исключения ActiveResource::Redirection, и вам придется обрабатывать это исключение в своем коде:

begin
  # Make some ActiveResource calls
rescue ActiveResource::Redirection
  # Error handling
end

Вы можете попробовать сделать новый HTTPS-запрос в блоке rescue (возможно, обновив атрибут site модели ActiveResource). Однако вам потребуется такая обработка ошибок во всех операциях ActiveResource, что затрудняет чтение и поддержку вашего кода.

Таким образом, я рекомендую вам не пытаться обрабатывать перенаправления в своем коде, а вместо этого требовать, чтобы все клиенты, подключающиеся к вашим приложениям, всегда использовали версию HTTPS.

person Pär Wieslander    schedule 21.12.2010
comment
Пар, спасибо за предложение. Мне просто было интересно, есть ли способ. Я согласен с вашей рекомендацией. Еще раз спасибо. - person Saim; 21.12.2010

Я не проверял, что это работает, но, прочитав ActiveResource API и быстрый поиск в Google, возможно, вы сможете поймать исключение, затем попытаться получить местоположение, на которое был перенаправлен запрос, а затем повторить операцию, используя новое местоположение?

     rescue ActiveResource::Redirection => ex
        unless retried
          domain = URI.parse(ex.response['Location']).host
          retried = true and retry # retry operation
        end
      end
person Upgradingdave    schedule 21.12.2010