如何使用Nginx使用HTTPS将非WWW重定向到WWW

时间:2020-03-21 11:48:02  来源:igfitidea点击:

Nginx是许多使用的流行的Web服务器软件之一。
其流行的一个主要原因是设计Web服务器所基于的事件驱动模型。
与其他流行的Web服务器(如Apache)不同,Nginx不会生成用于服务每个请求的进程。
在提供静态网页方面,它的速度非常快。
除此之外,它还可以用作缓存服务器和负载平衡器。
实际上,从第一天开始,Nginx Web服务器的目标就主要是“性能”。
基本上,使用很少的内存即可处理更多数量的同时请求。

尽管可以使用我们喜欢的任何名称托管(例如abc.example.com,xyz.example.com),但人们在访问时仍然遵循事实上的标准。
他们通常使用www后跟域名。
从互联网的早期开始就遵循了它的惯例。
使只能通过一个名称访问始终是一个好主意。

基本上,即使用户在浏览器上仅键入example.com/blah/blah,我们也需要一种将用户重定向到www.example.com/blah/blah的方法。

除此之外,使用SSL协议(HTTPS)的数量正在日益增加。
它是一种很好的安全措施,可以确认的身份并进行加密,以保护通过网络传输的数据。
即使用户忘记在浏览器中键入HTTPS,也应强制他们使用HTTPS。

因此,输入http://www.example.com的任何人都应自动重定向到https://www.example.com。

如何在Nginx中将非WWW重定向到WWW?

你们中的某些人可能只对将非www重定向到www以遵守通用标准感兴趣。
在本节中,让我们看一下实现此目标的Nginx中的配置片段。

erver {
    server_name  example.com;
    return       301 http://www.example.com$request_uri;
}
server {
        listen 80 default_server;
        root /usr/share/nginx/html;
        index index.html index.htm;
        server_name www.example.com;
}

上面显示的第一个服务器块将为所有命中“ example.com”服务器的请求提供服务。
然后,它将返回301 HTTP状态代码,其位置为“ http://www.example.com”,后跟最终用户键入的其余URL。

最终用户(浏览器或者任何http客户端)获得301响应后,它将再次将请求发送到建议的位置(即http://www.example.com)。
该请求将由第二个服务器块提供服务,第二个服务器块将以实际数据(即HTML页面)进行响应。
让我们看一下实际上使用curl命令(curl是用于将请求发送到Web服务器的命令行工具)。

curl -vv example.com
* Rebuilt URL to: example.com/
* Hostname was NOT found in DNS cache
*   Trying 10.12.4.215...
* Connected to example.com (10.12.4.215) port 80 (#0)
> GET/HTTP/1.1
> User-Agent: curl/7.35.0
> Host: example.com
> Accept: */*
>
< HTTP/1.1 301 Moved Permanently
* Server nginx/1.4.6 (Ubuntu) is not blacklisted
< Server: nginx/1.4.6 (Ubuntu)
< Date: Tue, 04 May 2016 15:28:33 GMT
< Content-Type: text/html
< Content-Length: 193
< Connection: keep-alive
< Location: http://www.example.com/

请注意,以>开头的行表示正在发送的HTTP请求的标头。
以<开头的行表示服务器正在返回HTTP响应(该响应清楚地显示301状态,在“位置”字段中的值为“ http://www.example.com”。
浏览器和其他客户端会遵循此响应,然后,向“位置”发送另一个请求。
这就是301重定向的工作方式)。

重要说明:请注意,DNS条目应存在于example.com和www.example.com(指向同一IP)上,这样才能起作用。

如何在Nginx中将HTTP重定向到HTTPS?

现在让我们看看如何解决我们的第二个问题。
这是对所有访问的用户强制执行https。
基本上,任何以http://www.example.com形式的请求都应重定向到https://www.example.com

让我们看一个实现此目的的示例nginx配置片段。

server {
    listen 80;
    server_name example.com www.example.com;
    return 301 https://$server_name$request_uri;
}
server {
        listen 443 default_server ssl;
        server_name example.com www.example.com;
        ssl_certificate    /etc/nginx/server.crt;
        ssl_certificate_key    /etc/nginx/server.key;
        root /usr/share/nginx/html;
        index index.html index.htm;
}

唯一值得注意的是在301之后的URL中使用HTTPS。
server_name表示在两个服务器块中定义的名称。
请记住在配置中包含server_name,以使其正常工作。
如果没有设置server_name,那么它将无法正常工作。
这是因为server_name变量在未设置的情况下将为空白,并且将重定向到https:///。

还要记住,在正确的路径中让第二个服务器部分具有适当的SSL证书。

在nginx中还有另一种方法可以实现HTTP到HTTPS的重定向(如下所示)

server {
    listen 80;
    server_name example.com www.example.com;
    rewrite     ^   https://$server_name$request_uri? permanent;
}
server {
        listen 443 default_server ssl;
        server_name example.com www.example.com;
        ssl_certificate    /etc/nginx/server.crt;
        ssl_certificate_key    /etc/nginx/server.key;
        root /usr/share/nginx/html;
        index index.html index.htm;
}

上面两种方法之间的唯一区别是使用重写而不是返回。
那么该使用哪一个呢?
那么,使用return的第一种方法始终是最好的,也是推荐的方法。
这是因为return总是比rewrite更好。

返回不需要读取URL字符串组件。
它只是返回301,而不管那里有什么请求。
重写模块非常适合完整的URL重写。
例如,任何点击http://www.example.com/abc-xyz的请求现在都应重写为http://www.example.com/abc_xyz。

如何使用HTTPS将非www重定向到www?

这是针对那些需要将任何将服务器命中的请求重定向到https://www的用户的。
例如,诸如http://example.com/something之类的请求应重定向到https://www.example.com/something。
我认为这是最好的方法,几乎所有都应该采取这种方法(因为最推荐使用HTTPS,而且从SEO角度来看,www并在整个中使用一个名称也确实不错)。

让我们看一个实现此目标的示例nginx代码段。

server {
    listen 80;
    server_name example.com www.example.com;
    rewrite     ^   https://$server_name$request_uri? permanent;
}
server {
        listen 443 default_server ssl;
        server_name example.com www.example.com;
        if ($host = 'example.com') {
      return 301 https://www.example.com$request_uri;
    }
        ssl_certificate    /etc/nginx/server.crt;
        ssl_certificate_key    /etc/nginx/server.key;
        root /usr/share/nginx/html;
        index index.html index.htm;
}

唯一不同的是第二个服务器块中的if语句。
没有该if语句,任何用户都可以直接发送请求,例如https://example.com/,该请求将起作用。
基本上,我们需要在第二个服务器块中添加一个逻辑来添加www部分。