У меня есть установка Nginx для моего тонкого сервера, на котором запущен проект Ruby on Rails. Nginx в настоящее время является конечной точкой для моего SSL.
Недавно у меня были проблемы с атаками на мой веб-сервер, поэтому я решил добавить CloudFlare. В настоящее время он использует «Строгий SSL» из облачного хранилища (ssl в ссылке клиента-CF и ссылке CF-веб-сервера). Теперь это работает при просмотре моего веб-сайта, но когда я использую Oauth для facebook, G + и т. Д. Ссылка перенаправления отображается как: https://example.com:80/destination/url
(Обратите внимание : 80). Этого не происходит, когда я не использую CloudFlare.
Что я могу сделать, чтобы это исправить? Это проблема в CloudFlare или Nginx? я нашел эта почта, но мне не удалось перепроектировать его в nginx.
Моя текущая настройка nginx:
server {
listen 80 default;
server_name .example.com;
## redirect http to https ##
return 301 https://example.com$request_uri;
}
server {
listen 443 ssl;
server_name .example.com;
client_max_body_size 20M;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_prefer_server_ciphers on;
ssl_ciphers EECDH+ECDSA+AESGCM:EECDH+aRSA+AESGCM:EECDH+ECDSA+SHA384:EECDH+ECDSA+SHA256:EECDH+aRSA+SHA384:EECDH+aRSA+SHA256:EECDH+aRSA+RC4:EECDH:EDH+aRSA:RC4:!aNULL:!eNULL:!LOW:!3DES:!MD5:!EXP:!PSK:!SRP:!DSS;
ssl_certificate /home/my_user/.ssl/example.crt;
ssl_certificate_key /home/my_user/.ssl/example.key;
access_log /var/www/example_server/log/access.log;
error_log /var/www/example_server/log/error.log;
root /var/www/example_server;
index index.html;
if ($host != 'example.com' ) {
return 301 https://example.com$request_uri;
}
location / {
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $http_host;
proxy_set_header X_FORWARDED_PROTO $scheme;
proxy_redirect off;
try_files /system/maintenance.html $uri $uri/index.html $uri.html @ruby;
}
location @ruby {
proxy_pass http://example.com;
}
}
В моем nginx.conf:
#default stuff
http{
set_real_ip_from *IP address for cloudflare*;
#....
port_in_redirect off;
#more default stuff
Для справки, текущий путь запроса: Client Request -SSL-> CloudFlare -SSL-> Nginx -non-SSL-> Thin -non-ssl-> Nginx -SSL-> CloudFlare -SSL-> Client Response
Похоже, что в геме Omniauth есть проблема, которая вызывает эту проблему. Почему это проблема, только когда я использую CloudFlare, а не проблема, когда она выключена, меня больше всего удивляет.
Во всяком случае, вот проблема на github:
https://github.com/intridea/omniauth/issues/101
Мое решение:
В приложении rails создайте новый инициализатор (config/initializers/omniauth_fix.rb
) с этим содержанием:
if Rails.env.production?
module OmniAuth
module Strategy
def full_host
uri = URI.parse(request.url)
uri.path = ''
uri.query = nil
uri.port = (uri.scheme == 'https' ? 443 : 80)
uri.to_s
end
end
end
end
По сути, это обезьяна по этому поводу. Надеюсь, это будет исправлено в будущих версиях omniauth.
Это кажется странным, потому что мы не добавляем перенаправления, если только вы специально не попросите нас сделать это с помощью PageRule. Я бы порекомендовал открыть заявку в службу поддержки с поддержкой CloudFlare, чтобы мы могли ее проверить.