NGINX try_files后备

时间:2016-02-25 20:49:14

标签: http nginx server

我有这个文件夹结构:

/document/root/
|-- main
`-- wishlist

我想让我的nginx像这样工作:如果我将浏览器指向example.com/wishlist,它将在index.html文件夹中显示wishlist。如果我将浏览器指向example.com,我希望它回退到main/index.html(当然还有相关的main/style.css和主目录中的其他文件。)

我不想为我根目录下的每个文件夹写一个位置规则,所以我希望它尽可能通用。我找到了this questtion,它帮助我完成了大部分工作,但是有些东西不起作用:如果我将浏览器指向wishlist/index.html,它就能完美运行。但是,如果我删除index.html并将其指向example.com/wishlist,则浏览器将返回404.我当前的Nginx配置位于下方。有人能指出我正确的方向吗?感谢。

server {
    listen 80;
    listen [::]:80;
    server_name example.com www.example.com;
    root /document/root/main;

    location ~ ^/([^/]+)(/.+)?$ {
        if (!-d "$document_root/$1") {
            return 404;
        }
        try_files /$1$2 /main$2 =404;
     }
}

3 个答案:

答案 0 :(得分:2)

您需要为索引文件做的只有:

index index.html

location / {
    try_files $uri.html $uri/index.html =404;
}
location /wishlist {
    try_files $uri.html $uri/index.html =404;
}

答案 1 :(得分:2)

保持简单:

server {
    root /document/root/main/;
    index index.html;

    location /wishlist {
        root /document/root/;
    }
}

答案 2 :(得分:1)

原来我发现了一种对我有用的方法:在nginx上使用自定义location / { root /document/root/main; index index.html; try_files $uri $uri/ index.html; } location ~ ^/(.+)$ { root /document/root; index index.html; try_files $uri $uri/ index.html @main; } location @main { try_files /main/$uri /main/$uri/; } 。我的最后一段代码就是这样的:

example.com

现在/document/root/main使用example.com/wishlist作为根,/document/root/wishlist使用flock(..., LOCK_EX) :)希望这有助于其他人。