使用IF的Nginx conf

时间:2014-12-24 15:41:05

标签: nginx

在nginx.conf上,我将所有桌面流量重定向到/desktop/index.html,iPhone / Android访问权限定向到/index.html

在conf文件中,我使用“IF”和http_user_agent来确定iphone与桌面,但我注意到使用“If”是一种糟糕的写作方式。如何解决此问题,以便此重定向不使用ifs。

set $is_sphone 0;

if ($http_user_agent ~ iPhone) {
  set $is_sphone 1;
}

if ($http_user_agent ~ Android) {
  set $is_sphone 1;
}

location /index.html {
  if ($is_sphone = 1) {
    rewrite ^(.*)$ /index.html break;
  }

  if ($is_sphone != 1) {
    rewrite ^(.*)$ /desktop/index.html break;
  }
}

1 个答案:

答案 0 :(得分:1)

如果您只想向不同的设备显示不同的静态index.html文件,您只需将文档根目录指向相应的文件夹,然后就不需要引入其他位置或进行重写。有几种方法可以做到,但在我看来map提供了最简单的方法。

从概念上讲,配置如下所示:

map $http_user_agent $root {
    default          "/path/to/desktop/folder";

    "~*iPhone"       "/path/to/mobile/folder";
    "~*Android"      "/path/to/mobile/folder";
}

server {
    listen 80;
    ...

    index index.html;

    root $root;
}

顺便说一句,使用“if”并没有错,假设你知道它是如何工作的以及你在做什么。避免使用有用的工具只是因为它们在使用不当时会造成损害,这绝不是一个好主意。阅读有关此指令并将其用于您的利益会更加谨慎,而不是浪费时间试图找到不必要的解决方法。如果你浏览this article,你会发现“if”实际上是非常符合逻辑的,所有与之相关的问题都可以很容易地预测和避免。

<强>更新

如果要在不更改根文件夹的情况下显示不同index.html的内容,map仍然有用。在这种情况下,配置如下所示:

map $http_user_agent $index_folder {
    default          "/desktop";

    "~*iPhone"       "";
    "~*Android"      "";
}

server {
    listen 80;
    ...

    index index.html;

    location /index.html {
        try_files "${index_folder}/index.html" =404;
    }

    root /path/to/root/foler;
}