在 Linux 上使用 nginx 设置 SSL

在 Linux 上使用 nginx 设置 SSL

我有这个客户端服务器,我想在像这个 app..net 这样的网站上设置 SSL

服务器运行 ubunto 并用 laravel / php 编写。

server {
    server_name <domain>.net www.<domain>.net;
    return 301 https://app.<domain>.net$request_uri;
}

server {
    listen 443 ssl;
    server_name app.<domain>.net;

    root /home/<domain>/www/site/public;

    location / {
        index index.php;
        try_files $uri $uri/ /index.php?q=$uri&$args;
    }

    error_page 404 /index.php;

    location ~ \.php? {
        include fastcgi_params;
        fastcgi_index index.php;
        fastcgi_pass unix:/var/run/php5-fpm.<domain>.sock;
        fastcgi_split_path_info ^(.+\.php)(/.+)$;
        fastcgi_param PATH_INFO $fastcgi_path_info;
        fastcgi_param PATH_TRANSLATED $document_root$fastcgi_path_info;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    }

    ssl on;
    ssl_certificate /etc/nginx/ssl/<domain>/ssl-bundle.crt;
    ssl_certificate_key /etc/nginx/ssl/<domain>/<domain>.key;
    ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
    ssl_ciphers 'ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:DHE-R$
    ssl_prefer_server_ciphers on;

    access_log /home/<domain>/logs/access.log;
    error_log /home/<domain>/logs/error.log;
}

这是我的特定网站的配置文件。现在,当我访问 app..net 时,我登录的是 www..com,我不知道问题出在哪里。

编辑:

如果我将配置文件更改为以下内容:

server {
    server_name <domain>.net www.<domain>.net;
    return 301 http://<domain>.net$request_uri;
}

server {
    server_name app.<domain>.net;

    root /home/<domain>/www/site/public;

    location / {
        index index.php;
        try_files $uri $uri/ /index.php?q=$uri&$args;
    }

    error_page 404 /index.php;

    location ~ \.php? {
        include fastcgi_params;
        fastcgi_index index.php;
        fastcgi_pass unix:/var/run/php5-fpm.<domain>.sock;
        fastcgi_split_path_info ^(.+\.php)(/.+)$;
        fastcgi_param PATH_INFO $fastcgi_path_info;
        fastcgi_param PATH_TRANSLATED $document_root$fastcgi_path_info;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    }

    ssl on;
    ssl_certificate /etc/nginx/ssl/<domain>/ssl-bundle.crt;
    ssl_certificate_key /etc/nginx/ssl/<domain>/<domain>.key;
    ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
    ssl_ciphers 'ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:DHE-R$    ssl_prefer_server_ciphers on;

    access_log /home/<domain>/logs/access.log;
    error_log /home/<domain>/logs/error.log;
}

然后我进入了正确的页面,但没有 https

答案1

据我所知,您的域名没有从 HTTP 重定向到 HTTPS。

这可以解释为什么如果不监听该域的 80 端口,NGINX 就会回退到默认服务器,我认为该服务器是您的主域。

无论如何,如果您希望在 app..net 上自动使用 HTTPS,则应将 app..net 添加到将 HTTP 重定向到 HTTPS 的第一个块。

答案2

来自您编辑的配置的此服务器块:

server {
    server_name <domain>.net www.<domain>.net;
    return 301 http://<domain>.net$request_uri;
}

毫无意义,只会创建无休止的重定向循环:从http://<domain>.net/回到http://<domain>.net/

如果主要地址是https://应用程序..net/ 并且你希望将用户重定向到那里(并且始终使用 https),只需写入:

server {
   server_name <domain>.net www.<domain>.net app.<domain>.net;
   return 301 https://app.<domain>.net/;
}

server {
   server_name app.<domain>.net;
   listen 443;
   ssl on;
   ...
}

如果 nginx 配置中没有其他 server { } 块,则第一个黑色可以写为

server {
   server_name _;
   listen 80 default_server;
   return 301 https://app.<domain>.net/;
}

还要检查 PHP 应用程序的配置方式 - 可能是应用程序发送了一些重定向。

相关内容