如何使用Nginx使用HTTPS将非WWW重定向到WWW
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部分。