Nginx(一) try_files 配置

本文介绍如何使用Nginx的try_files指令优化前端路由,避免刷新或访问不存在路径时直接跳转至404页面。通过正确配置,可实现SPA应用的平滑过渡。

示例简单配置如下:

server {
        listen       8088;
        server_name  localhost;
        
        location / {
            root   /home/demo/deploy/front/dist;
            index  index.html index.htm;
        }
        
        location /dev-api/ {
            autoindex on;
            client_max_body_size 100m;
            proxy_pass https://xx.xx.xx.xx:1440/;
        }

        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }
 }

上面 root 对应为前段项目dist包部署位置, proxy_pass 为对应的后端服务

上述配置在通过浏览器访问时,进行刷新 或 访问不错在的路径时会直接跳到Nginx的404页面。

针对上面的情况只需要在Nginx添加一个try_files配置即可,如下:

location / {
    root   /home/demo/deploy/front/dist;
    index  index.html index.htm;
    try_files $uri $uri/ /index.html;
}

try_files $uri $uri/ /index.html

try_files -尝试访问对应的资源,在第一个资源访问不到时,访问第二个资源,以次向后

$uri Nginx地址变量,即为访问的地址

若访问url为 http://www.xxx.com/index.html 则 $uri 为 /index.html

$uri/ 表示一个目录,请求访问的目录,Nginx try_files可自行判断访问目的的类型 是为文件还是目录

若访问url为 http://www.xxx.com/user/class/ 则 $uri/ 为 /user/class/

所以以上配置的规则为 当 $uri 和 $uri/ 均不是对应资源时 则返回 /index.html 页面

 

### `try_files` 指令的基本用法 `try_files` 是 Nginx 中用于尝试按顺序查找文件的指令,常用于前端路由的配置,特别是在使用 Vue Router 或 React Router 的 `hash` 模式时。该指令允许 Nginx 在指定的路径中查找资源,如果找不到对应的文件或目录,则可以重定向到指定的 URI 或返回错误码。 其基本语法如下: ``` try_files file ... uri; ``` 或者: ``` try_files file ... =code; ``` 其中,`file` 表示要尝试查找的文件或路径,`uri` 表示如果所有文件都找不到,则重定向到该 URI;`code` 表示返回的 HTTP 状态码(如 404)[^2]。 例如,在个典型的前端项目中,可以使用如下配置: ```nginx location / { root /home/demo/deploy/front/dist; index index.html index.htm; try_files $uri $uri/ /index.html; } ``` 此配置表示:Nginx 会首先尝试匹配请求的 URI 对应的文件或目录,如果找不到,则返回 `/index.html`,使前端路由能够接管 URL 的处理[^1]。 --- ### `try_files` 的高级用法 `try_files` 不仅可以用于前端路由的重定向,还可以结合命名 location 实现更复杂的逻辑。例如,可以将请求转发到后端服务,如下所示: ```nginx location / { try_files $uri $uri/ @backend; } location @backend { proxy_pass http://backend.example.com; } ``` 在此配置中,如果请求的文件或目录不存在,Nginx 将请求转发到 `@backend` 命名 location,进而代理到后端服务[^4]。 此外,还可以在 `try_files` 中指定多个备选路径。例如: ```nginx location / { try_files /system/maintenance.html $uri $uri/index.html $uri.html @mongrel; } location @mongrel { proxy_pass http://mongrel; } ``` 此配置优先尝试返回 `/system/maintenance.html`,如果不存在,则依次尝试 `$uri`、`$uri/index.html` 和 `$uri.html`,如果都找不到,则转发到 `@mongrel` 处理[^5]。 --- ### `try_files` 与查询参数的处理 需要注意的是,`try_files` 不会自动处理查询参数(即 URL 中 `?` 后面的部分),但可以通过 `$query_string` 变量进行判断和处理。例如: ```nginx location / { set $root_path '/var/www/phalcon/public'; root $root_path; try_files $uri $uri/ /index.php; } ``` 在此配置中,即使 URL 中包含查询参数,`try_files` 也会正常工作,将请求转发到 `/index.php` 进行处理[^3]。 --- ### 配置示例总结 以下是些常见的 `try_files` 配置示例: 1. **前端路由支持(Hash 模式)**: ```nginx location / { root /home/demo/deploy/front/dist; index index.html index.htm; try_files $uri $uri/ /index.html; } ``` 2. **结合后端代理**: ```nginx location / { try_files $uri $uri/ @backend; } location @backend { proxy_pass http://backend.example.com; } ``` 3. **多级备选路径**: ```nginx location / { try_files /system/maintenance.html $uri $uri/index.html $uri.html @mongrel; } location @mongrel { proxy_pass http://mongrel; } ``` 4. **PHP 项目配置**: ```nginx location / { try_files $uri $uri/ /index.php; } location ~ \.php$ { try_files $uri =404; fastcgi_pass 127.0.0.1:9000; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; include fastcgi_params; } ``` --- ###
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值