Кажется, есть много вопросов и руководств, в которых рассказывается, как настроить nginx для перенаправления HTTP-запросов на https. Многие из них устарели или просто неверны.
# MANAGED BY PUPPET
upstream gitlab {
server unix:/home/git/gitlab/tmp/sockets/gitlab.socket;
}
# setup server with or without https depending on gitlab::gitlab_ssl variable
server {
listen *:80;
server_name gitlab.localdomain;
server_tokens off;
root /nowhere;
rewrite ^ https://$server_name$request_uri permanent;
}
server {
listen *:443 ssl default_server;
server_name gitlab.localdomain;
server_tokens off;
root /home/git/gitlab/public;
ssl on;
ssl_certificate /etc/ssl/certs/ssl-cert-snakeoil.pem;
ssl_certificate_key /etc/ssl/private/ssl-cert-snakeoil.key;
ssl_protocols SSLv3 TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers AES:HIGH:!ADH:!MDF;
ssl_prefer_server_ciphers on;
# individual nginx logs for this gitlab vhost
access_log /var/log/nginx/gitlab_access.log;
error_log /var/log/nginx/gitlab_error.log;
location / {
# serve static files from defined root folder;.
# @gitlab is a named location for the upstream fallback, see below
try_files $uri $uri/index.html $uri.html @gitlab;
}
# if a file, which is not found in the root folder is requested,
# then the proxy pass the request to the upsteam (gitlab puma)
location @gitlab {
proxy_read_timeout 300; # https://github.com/gitlabhq/gitlabhq/issues/694
proxy_connect_timeout 300; # https://github.com/gitlabhq/gitlabhq/issues/694
proxy_redirect off;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Forwarded-Ssl on;
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_pass http://gitlab;
}
}
Я перезагружался после каждого изменения конфигурации, но все равно получаю страницу «Добро пожаловать в nginx» только при посещении http://192.168.33.10
. в то время как https://192.168.33.10
работает отлично.
Почему nginx по-прежнему не перенаправляет HTTP-запросы на https?
Я также пробовал следующие конфигурации
listen *:80;
server_name <%= @fqdn %>;
#root /nowhere;
#rewrite ^ https://$server_name$request_uri? permanent;
#rewrite ^ https://$server_name$request_uri permanent;
#return 301 https://$server_name$request_uri;
#return 301 http://$server_name$request_uri;
#return 301 http://192.168.33.10$request_uri;
return 301 http://$host$request_uri;
Журналы
tailf /var/log/nginx/access.log
192.168.33.1 - - [22/Oct/2013:03:41:39 +0000] "GET / HTTP/1.1" 304 0 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:24.0) Gecko/20100101 Firefox/24.0"
192.168.33.1 - - [22/Oct/2013:03:44:43 +0000] "GET / HTTP/1.1" 200 133 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:24.0) Gecko/20100101 Firefox/24.0"
tailf /var/log/nginx/gitlab_error.lob
2013/10/22 02:29:14 [crit] 27226#0: *1 connect() to unix:/home/git/gitlab/tmp/sockets/gitlab.socket failed (2: No such file or directory) while connecting to upstream, client: 192.168.33.1, server: gitlab.localdomain, request: "GET / HTTP/1.1", upstream: "http://unix:/home/git/gitlab/tmp/sockets/gitlab.socket:/", host: "192.168.33.10"
Ресурсы
https://www.nginx.com/resources/wiki/start/topics/tutorials/config_pitfalls/
Как сделать перенаправление nginx
Как заставить или перенаправить на SSL в nginx?
nginx ssl перенаправление
Перенаправление Nginx и Https
https://www.tinywp.in/301-redirect-wordpress/
Как заставить или перенаправить на SSL в nginx?
Я определил проблему.
У меня была запись в / etc / hosts, которая была неправильно настроена
127.0.0.1 gitlab.localdomain gitlab
Как только я изменил его на следующее, перенаправления https начали работать
192.168.33.10 gitlab.localdomain gitlab
Итак, в заключение, это рабочий синтаксис.
server {
listen 80;
server_name gitlab.localdomain;
server_tokens off;
return 301 https://$host$request_uri;
}
server {
listen 443 ssl default_server;
server_name gitlab.localdomain;
server_tokens off;
root /home/git/gitlab/public;
ssl on;
ssl_certificate /etc/ssl/certs/ssl-cert-snakeoil.pem;
ssl_certificate_key /etc/ssl/private/ssl-cert-snakeoil.key;
ssl_protocols SSLv3 TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers AES:HIGH:!ADH:!MDF;
ssl_prefer_server_ciphers on;
…
Заметка
Редирект работает только при вызове URL-адреса по имени, он не перенаправляет при переходе на IP-адрес.
2 вещи, как обеспечить перенаправление с http на https
в вашем HTTPS - разделе включите HSTS-Заголовок _> это гарантирует, что ваш браузер будет отправлять будущие запросы только по HTTPS.
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains";
в вашем http-разделе: вы можете либо return 301 https://$server_name$request_uri;
(самый быстрый подход) или переписать (медленнее)
server {
listen 80;
server_name _;
server_tokens off;
return 301 https://$host$request_uri;
}