Nginx ouve várias portas, mas reescreve para uma

1

Portanto, tenho um aplicativo em execução que, por motivos herdados, deve manter seu URL antigo com um número de porta à direita em funcionamento.

Portanto, tenho uma configuração semelhante a esta:

server {
        listen 443 ssl;
        listen 8080 ssl;
        server_name myurl.com;

        ssl                     on;
        ssl_certificate         /etc/nginx/conf.d/certfile.pem;
        ssl_certificate_key     /etc/nginx/conf.d/keyfile.key;
        ssl_session_timeout     5m;
        ssl_session_cache       shared:SSL:10m;
        ssl_protocols           TLSv1 TLSv1.1 TLSv1.2;
        ssl_ciphers             HIGH:!aNULL:!MD5;
        ssl_prefer_server_ciphers   on;

        location / {

        proxy_pass              http://127.0.0.1:7990;
        proxy_http_version      1.1;
        proxy_set_header        Host $host;
        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_set_header        X-Real-IP $remote_addr;
        proxy_set_header        Location $host:443;
        proxy_redirect          off;
        }

}

Ele está funcionando bem, exceto pelo fato de que alguma requisição AJAX feita de myurl.com:8080 irá gerar erros de CRSF. Eu gostaria de fazer com que, quando um usuário se conectar com a porta 8080, o nginx reescreva-o automaticamente para 443. Isso é possível fazer? Eu tentei adicionar vários cabeçalhos, mas nenhum deles parecia fazer o truque.

Também tentei fazer um return 301 https://$server_name:443$request_uri; , mas o nginx não gostou muito.

    
por Kaspar 12.09.2016 / 15:37

1 resposta

3

Você pode dividir o bloco do servidor em dois, um para cada porta. Mova a configuração comum para o bloco externo (se esses forem os únicos blocos de servidor que você possui) ou inclua a configuração comum com uma diretiva include .

Por exemplo:

ssl_certificate         /etc/nginx/conf.d/certfile.pem;
ssl_certificate_key     /etc/nginx/conf.d/keyfile.key;
ssl_session_timeout     5m;
ssl_session_cache       shared:SSL:10m;
ssl_protocols           TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers             HIGH:!aNULL:!MD5;
ssl_prefer_server_ciphers   on;

server {
    listen 8080 ssl;
    server_name myurl.com;
    return 301 https://$server_name$request_uri;
}

server {
    listen 443 ssl;
    server_name myurl.com;

    location / { ... }
}

A diretiva return não precisa de uma especificação de porta se a https port for 443 . Se nginx insistir em adicionar a porta 8080 , tente adicionar uma instrução port_in_redirect off; .

    
por 12.09.2016 / 16:49

Tags