Как перенаправить на тот же порт с 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;
}
}
Я пробовал много вещей, а также читать сообщения об этом, в том числе этот вопрос serverfault, но пока ничего не получилось.
4 ответов
нашел что-то, что работает хорошо :
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;
}
}
вы уверены, что ваше решение работает? Он прослушивает 8001 ssl. Будет ли он принимать http-запрос?
Я делаю это так:
server {
listen 80;
server_name yourhostname.com;
location / {
rewrite ^(.*) https://yourhostname.com:8001 permanent;
}
}
затем идет ваша конфигурация:
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;
}
}
вы можете
- используйте $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
...
}
это сработало для меня:
server {
listen 80;
server_name localhost;
...
if ($http_x_forwarded_proto = "http") {
return 301 https://$server_name$request_uri;
}
location / {
proxy_set_header X-Forwarded-Host $host;
proxy_set_header X-Forwarded-Server $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_pass http://localhost:8080;
}
...
}