2014-12-24 68 views
0

在nginx.conf中,我將所有桌面流量重定向到/desktop/index.html,iPhone/Android訪問指向/index.html使用IF的Nginx conf

在conf文件中,我使用「IF」和http_user_agent來確定iPhone vs桌面,但我注意到使用「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

如果你只是想不同的靜態的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; 
} 

順便說一下,也沒什麼不好,使用「如果」,假設你知道它是如何工作的,你在做什麼。避免使用有用的工具只是因爲它們在不恰當地使用時會造成損害從來就不是一個好主意。閱讀此指令並將其用於您的利益將更加謹慎,而不是浪費時間尋找不必要的解決方法。如果您瀏覽this article,您會發現「if」實際上非常合乎邏輯,所有可能相關的問題都可以輕鬆預測並避免。

UPDATE:

如果你想顯示不同的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; 
} 
+0

我只是想指向/desktop/index.html桌面的index.html不是整個目錄。 – Maca

+0

我添加了一個如何在原始答案中完成的例子。 –

+0

所以「」將是空的? – Maca

相關問題