绝对能用的一篇nginx配置,文末直接有文件,伸手党直接拿走php
本文环境比较复杂,首先两层nginx转发,而且访问路径也不是根路径。加上对nginx只知其一;不知其二,各路搜索一看,全程懵逼。最终没有一个能用的。最后仍是靠同事帮助,文档大法结束加班。本文知识点:location优先级,nginx资源文件寻找方式,rewrite 重定向问题。css
当用户请求 http://localhost/example 时,这里的 $uri 就是 /example。
try_files 会到硬盘里尝试找这个文件。若是存在名为 /$root/example(其中 $root 是项目代码安装目录)的文件,就直接把这个文件的内容发送给用户。
显然,目录中没有叫 example 的文件。而后就看 $uri/,增长了一个 /,也就是看有没有名为 /$root/example/ 的目录。
又找不到,就会 fall back 到 try_files 的最后一个选项 /index.php,发起一个内部 “子请求”,也就是至关于 nginx 发起一个 HTTP 请求到 http://localhost/index.php。html
首先文件存放路径是子目录 /usr/local/services/app_logical_server-1.0/bin/app/screen
访问路径是 https://example.com/app/screen/
react
server { listen 8080; root /usr/local/services/app_logical_server-1.0/bin/app/screen; location ~* \.(gif|jpg|png|js|css)$ { root /usr/local/services/app_logical_server-1.0/bin/app/screen/; } location ^~ /app/screen { root html; index index.html; try_files $uri $uri/ /index.html; } }
错误现象是index.html能够找到,可是index.html中的js写的是相对路径,致使全部的静态资源文件也进入了第二个location,致使页面白屏。
分析以下。nginx
首先匹配 =,其次匹配^~, 其次是按文件中顺序的正则匹配,最后是交给 / 通用匹配。当有匹配成功时候,中止匹配,按当前匹配规则处理请求。
~* 的优先级低于 ^~因此第一个配置静态资源文件虽然写在前面,仍是不会进去的。react-router
解决优先级问题后,问题依然存在。缘由就是这个。root 在server和location中都有,都是配置文件开始寻找的根路径,若是url是https://xxxx:8084/app/screen,location中的配置优先级高于server。首先会进入第二个location中,寻找文件,文件路径是root和域名后面的路径的拼接,例如:访问路径是 https://example.com/app/screen/umi.js
,server root 为 /usr/local/services/app_logical_server-1.0/bin/app/screen
。 nginx寻找文件的地址为/usr/local/services/app_logical_server-1.0/bin/app/screen/app/screen/umi.js
.固然找不到,报404错误。app
server { listen 8084; root /usr/local/services/app_logical_server-1.0/bin/; location ~* \.(gif|jpg|png|js|css)$ { root /usr/local/services/app_logical_server-1.0/bin; } location ~* /app/screen { #try_files $uri $uri/ /usr/local/services/app_logical_server-1.0/bin/app/screen/index.html; root /usr/local/services/app_logical_server-1.0/bin; try_files /app/screen/index.html =404; } }
/
的url重定向问题当前配置还有个问题,就是末尾不带斜杠时,index.html能够加载到,可是html中的资源文件写的相对路径,当url 为https://example/app/screen
时,相对路径为https://example/app
,以js为例,https://example/app/umi.js
,因此报404错误。
解决方案为,利用location优先级,再加一个 = /app/screen
的location 。编码
location = /sa/screen { rewrite ^([^.]*[^/])$ $1/ permanent; port_in_redirect off; }
可是到此还没结束。由于业务须要,本层nginx前面还有一层Nginx。因此301 重定向的时候,会带上端口号。致使找不到请求。port_in_redirect off;
配置能够解决此问题url
最终版完美配置code
server { listen 8084; root /usr/local/services/app_logical_server-1.0/bin/; location = /sa/screen { rewrite ^([^.]*[^/])$ $1/ permanent; port_in_redirect off; } location ~* \.(gif|jpg|png|js|css)$ { root /usr/local/services/app_logical_server-1.0/bin; } location ~* /app/screen { #try_files $uri $uri/ /usr/local/services/app_logical_server-1.0/bin/app/screen/index.html; root /usr/local/services/app_logical_server-1.0/bin; try_files /app/screen/index.html =404; } }