Как перенаправить на тот же порт с http на https с обратным прокси-сервером nginx
Я использую обратный прокси с Nginx, и я хочу заставить запрос в HTTPS, поэтому, если пользователь хочет получить доступ к URL-адресу с http, он будет автоматически перенаправлен на HTTPS.
Я также использую нестандартный порт.
Вот моя конфигурация обратного прокси nginx:
server {
listen 8001 ssl;
ssl_certificate /home/xxx/server.crt;
ssl_certificate_key /home/xxx/server.key;
location / {
proxy_pass https://localhost:8000;
proxy_redirect off;
proxy_set_header Host $host:$server_port;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Ssl on;
proxy_set_header X-Forwarded-Proto https;
}
}
Я пробовал много вещей, а также читал сообщения об этом, в том числе this serverfault вопрос, но пока ничего не сделано.
Ответы
Ответ 1
Нашел что-то, что хорошо работает:
server {
listen 8001 ssl;
ssl_certificate /home/xxx/server.crt;
ssl_certificate_key /home/xxx/server.key;
error_page 497 https://$host:$server_port$request_uri;
location /{
proxy_pass http://localhost:8000;
proxy_redirect off;
proxy_set_header Host $host:$server_port;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Ssl on;
}
}
Ответ 2
Вы уверены, что ваше решение работает? Он слушает 8001 ssl. Будет ли он принимать HTTP-запрос?
Я делаю так:
server {
listen 80;
server_name yourhostname.com;
location / {
rewrite ^(.*) https://yourhostname.com:8001$1 permanent;
}
}
Затем идет ваш config:
server {
listen 8001 ssl;
ssl_certificate /home/xxx/server.crt;
ssl_certificate_key /home/xxx/server.key;
location / {
proxy_pass https://localhost:8000;
proxy_redirect off;
proxy_set_header Host $host:$server_port;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Ssl on;
proxy_set_header X-Forwarded-Proto https;
}
}
Ответ 3
Вы можете
- используйте $server_name, чтобы избежать жесткого кодирования вашего доменного имени (DRY),
- используйте return 301 для более легкого чтения (веб-разработчик должен знать этот код состояния http).
Примечание. Я поставил 443 для https-сервера. Вы можете слушать 8001, если вы действительно этого хотите.
server {
listen 80;
server_name your_hostname.com;
return 301 https://$server_name$request_uri;
}
...
server {
listen 443 ssl;
server_name your_hostname.com
...
}