代码之家  ›  专栏  ›  技术社区  ›  Ender17

在nginx中强制www和https。conf(SSL)

  •  16
  • Ender17  · 技术社区  · 10 年前

    购买SSL证书后,我一直试图强制所有页面使用安全的https和www。

    https://www.exampl.com 是工作和安全的,但必须准确地键入。www.example。com或示例。com仍然指向http。

    我们使用nginx作为代理,需要在那里输入重写。我可以通过Putty进行SSH/root访问。我已经访问了nginx。conf,通过输入腻子。

    现在呢?我在这个页面上输入nginx命令吗?从光标所在的位置开始?先有命令行吗?

    HTTPS:

    .h访问 在我发现必须输入nginx之前,我得到了原始代码

    RewriteEngine On 
    RewriteCond %{HTTP_HOST} ^example.com [NC]
    RewriteCond %{SERVER_PORT} 80 
    RewriteRule ^(.*)$ https://www.example.com/$1 [R,L]
    

    Nginx代码转换器 这就是它在转换器上的显示方式。一切都正确吗?

    # nginx configuration location / {
    if ($http_host ~* "^example.com"){
    rewrite ^(.*)$ http://example.com/$1 redirect; } }
    

    然后

    万维网

    .h访问 在我发现必须输入nginx之前,我得到了原始代码

    #Force www:
    RewriteEngine on
    RewriteCond %{HTTP_HOST} ^example.com [NC]
    RewriteRule ^(.*)$ http://www.example.com/$1 [L,R=301,NC]
    

    Nginx代码转换器 这就是它在转换器上的显示方式。一切正常吗?

    # nginx configuration location / { 
    if ($http_host ~* "^example.com"){ 
    rewrite ^(.*)$ http://www.example.com/$1 redirect; } 
    

    }

    然后我会保存吗?重新启动?

    如有任何帮助,将不胜感激。我已经和这件事斗争了好几个星期。我的托管公司尽其所能提供帮助,现在我正在学习。还是我应该停下来雇一个开发商$$$

    谢谢

    4 回复  |  直到 10 年前
        1
  •  37
  •   Oleg    9 年前

    实现WWW和HTTPS重定向的最佳方法是创建一个新的 server Nginx配置中的部分:

    server {
        listen      80;   #listen for all the HTTP requests
        server_name example.com www.example.com;
        return      301         https://www.example.com$request_uri;
    }
    

    您还必须执行 https://example.com https://www.example.com 重定向。这可以通过类似于以下代码来完成:

    server {
        listen              443 ssl;
        server_name         example.com;
    
        ssl_certificate     ssl.crt; #you have to put here...
        ssl_certificate_key ssl.key; #   ...paths to your certificate files
        return      301     https://www.example.com$request_uri;
    }
    

    当然,每次更改后都必须重新加载Nginx配置。以下是一些有用的命令:

    检查配置中的错误:

    sudo service nginx configtest
    

    重新加载配置(这足以使更改“生效”):

    sudo service nginx reload
    

    重新启动整个Web服务器:

    sudo service nginx restart
    

    重要说明:

    所有您的 服务器 节必须在内部 http 节(或包含在 http 部分):

    http {
        # some directives ...
        server {
            # ...
        }
        server {
            # ...
        }
        # ...
    }
    
        2
  •  13
  •   JimmyBanks    7 年前

    下面的解决方案似乎清晰简单,所有内容都定义在一个服务器块中。因此,通过这种设置,我强迫所有人 https://www.domain.tld ,因此这两个处理程序在这里都是非HTTPS和非WWW on HTTPS。 有两个IF,但如果您不想将整个SSL块复制两次来处理它……这是一种方法。

    server {
        listen 80;
        listen 443 ssl;
    
        server_name domain.tld www.domain.tld;
    
        # global HTTP handler
        if ($scheme = http) {
            return 301 https://www.domain.tld$request_uri;
        }
    
        # global non-WWW HTTPS handler
        if ($http_host = domain.tld){
            return 303 https://www.domain.tld$request_uri;
        }
    }
    

    以及避免IF的更好解决方案:

    # Redirect all traffic from HTTP to HTTPS
    server {
        listen 80;
    
        server_name example.com www.example.com;
    
        # Destination redirect base URI
        set $RURI https://www.example.com;
    
        location / {return 301 $RURI$request_uri;}
    }
    
    # Redirect non-WWW HTTPS traffic to WWW HTTPS
    server {
        listen 443 ssl;
        # NOTE: SSL configuration is defined elsewhere
        server_name example.com;
        return 301 $scheme://www.$host$request_uri;
    }
    
    # MAIN SERVER BLOCK
    server {
        listen 443 ssl;
        # NOTE: SSL configuration is defined elsewhere
        server_name www.example.com;
    }
    
        3
  •  0
  •   David Noriega    10 年前

    如果您有启用站点的目录,请不要使用“http”top指令。只需在启用站点的目录中创建另一个文件(任何名称),该文件具有:

    server {
        listen      80;   #listen for all the HTTP requests
        server_name example.com www.example.com;
        return      301         https://www.example.com$request_uri;
    }
    

    并注释该行

    listen 80; 
    

    其中,服务器名与服务于www.example.com的其他文件中的服务器名相同

        4
  •  0
  •   download    6 年前

    我找了很多,最后这是我的正确答案。 还记得在域名注册器的dns控制面板中添加www a记录。

     # Force all users to https://www.example.com
    server {
        listen 80;
        server_name example.com www.example.com;
        return 301 https://www.example.com$request_uri;
    }
    server {
        listen 443 ssl;
        server_name example.com;
        ssl_certificate /etc/nginx/ssl/www.example.com.pem;
        ssl_certificate_key /etc/nginx/ssl/www.example.com.key;
        return 301 https://www.example.com$request_uri;
    }
    server {
        listen 443 ssl;
        server_name www.example.com;
        root /var/www/html
    
        error_page  403 /error/404.html;
        error_page  404 /error/404.html;
        error_page  500 502 503 504 /error/50x.html;
        ssl_certificate /etc/nginx/ssl/www.example.com.pem;
        ssl_certificate_key /etc/nginx/ssl/www.example.com.key;
    }