Rails: ActiveResource и Apache Redirect - PullRequest
       27

Rails: ActiveResource и Apache Redirect

1 голос
/ 21 декабря 2010

У меня есть приложения 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)?

Спасибо

Имран

Ответы [ 2 ]

1 голос
/ 21 декабря 2010

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

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

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

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

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

1 голос
/ 21 декабря 2010

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

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