繁体   English   中英

如果Nginx找不到http_cookie,则尝试提供静态文件,否​​则回退到php

[英]if Nginx does not find a http_cookie then try serving a static file, otherwise fallback to php

我对nginx相对较新,并且正在努力了解其中的一些概念。

我有一个php应用程序,我也有一些静态html文件,我希望使用这些文件供未登录的用户使用。我可以通过http cooke的存在来确定它(如果登录或将'loggedin'设置为1,如果没有,则不会显示或设置为0)。

静态文件可能对注销的用户可用或不可用,如果没有,那么我希望php处理请求

我最大的尝试来解决这个问题是这样的

location / {
    if ($http_cookie ~* "loggedin" ) {
        set $cachepath '/cache$request_uri.html';

    }
    try_files $cachepath $uri /index.php?$query_string;

}

但这不起作用。 同样值得注意的是,我的php应用程序提供的网址也是如此,例如www.website.com/about-us/(末尾带有斜杠)。 因此,如上查找缓存文件时,该缓存文件应为cache / about-us.html。 另外,我有一个名为index.html的静态主页,但我不确定该如何服务。

感谢任何可以帮助我的人。

您需要从URI尾随/提取基本名称,然后测试文件是否存在。 一种方法是使用带有命名捕获的正则表达式location 有关更多信息,请参见此文档

例如:

location ~ ^/(?<name>[^/]+)/ {
    if ($http_cookie ~* "loggedin") {
        rewrite ^ /index.php last;
    }
    if (-f $document_root/cache/$name.html) { 
        rewrite ^ /cache/$name.html last;
    }
    rewrite ^ /index.php last;
}
location / { ... }
location ~ \.php$ { ... }

第一个location块仅处理由名称和结尾/组成的URI。 如果cookie存在,第一个if块将重定向到PHP(我认为您问题中的逻辑已倒置)。 第二个if块测试是否存在匹配的缓存文件。

请参阅有关使用if 注意事项

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM