1.情景展示
我们知道,nginx三个核心功能是:静态服务器、反向代理和负载均衡;
nginx可以充当静态服务器,将静态资源文件(HTML、CSS、JS、图片等文件)通过网络进行访问。
如下图所示:
通过网络访问得到demo.html文件,我们直接在nginx服务后面+"/路径/demo.html"即可。
对于习惯了全栈式开发的java人员来说,往往会觉得这种方式很别扭,因为,要访问的页面控制权往往在javaWeb后台手里;
换句话说就是:浏览器无法直接访问页面,浏览器只能通过向后台发送请求至后台Controller,由它来决定最终要转发或重定向的页面。
但是,前后端分离后,后端释放了对于页面的控制权,取而代之的是:nginx来充当前端的服务器。
这种直接将本地文件暴露在网络上的方式,我觉得不太好。
能不能,为网页提供虚拟访问路径,通过虚拟路径访问到对应的html文件,而不是直接访问html文件?
2.具体分析
location的网络请求映射和本地目录映射来实现。
3.解决方案
我们先来看一看:如何通过网络访问html文件?
我的demo.html的绝对路径是:C:\Users\Marydon\Desktop\demo.HTML;
找到nginx的安装目录--》找到conf目录下的nginx.conf;
使用文本工具打开nginx的配置文件。
sever:就是服务器的意思,我们通过server{}来进行服务器配置;
listen:这是配置的是服务器使用的端口号(默认值是80);
server_name:配置的是该服务器的访问IP(默认值是localhost);
--------------------------------------------------------------------
以上是默认的nginx服务器配置,代表的含义是:
服务器访问地址:http://localhost:80。
--------------------------------------------------------------------
charset:服务器的字符集(默认没有启用该项配置);
location+请求路径:对指定的请求进行具体处理,具体处理在{}中进行;
root+目录:本地项目所在根路径;
index+目录:本地项目欢迎页所在路径及欢迎文件名。
location / {
root html;
index index.html index.htm;
}
代表的意思是:
访问http://localhost,将会映射到该location标签体,最终指向的是html/index.html。
配置网页的虚拟访问路径
说明:虚拟主机配置多个location,根据url的不同,路由到不同的代理路径上。
如何为http://localhost/index配置虚拟访问路径?
#路径包含/index/的请求,跳转到C:\Users\Marydon\Desktop\demo.HTML页
location /index/ {
root C:\Users\Marydon\Desktop;
rewrite ^/index$ \demo.HTML break;
}
location /index/:设置服务器拦截含有/index/的请求
root:要访问的文件所在目录;
rewrite:使用正则表达式设置跳转规则及跳转页面。
注意:如果配置的映射路径不是静态资源文件的真实访问路径,需要在路径末尾加上"/"。
具体原因,第4部分。↓↓↓
4.扩展
如何禁用nginx欢迎页?
我们通过上面可以知道:通过location /最终指向的是html/index.html文件;
所以,我们有两种实现方式。
错误方式:修改nginx.conf并重新加载配置文件。
可以使用#号将index注释掉或者删掉。
index.html可以照常访问。
正确方式:删除或者重命名index.html。
在html目录下。
对应的是:
对应的是:
如何自定义指定nginx的欢迎页?
方式一:修改html目录下的index.html文件。
方式二:修改映射欢迎页的根目录。
映射路径末尾要不要加"/"?
如果是虚拟路径的话需要加"/",如果是真是路径,不需要加"/"。
映射路径不以"/"结尾,表示的含义是:匹配所有以XX开头的请求。
举例:
我本想将/index映射到demo.html上,但是,location /index {}却拦截了所有以"/index"开头的请求。
首页访问变成了404
/请求指定的root无效,实际其作用的是/index对应的root。
因为nginx先是检测到请求是"/",然后转换成index请求,结果被location /index{}截获,最终就成了下面这个样子。
访问/index.html也是如此
此时,我们去访问/50x.html是不受影响的。
所以,我们可以断定:请求跑串啦,所以,为了让各个请求互不干扰,我们需要为虚拟路径末尾加上"/"。