2014-12-24 2 views
0

На nginx.conf У меня есть весь рабочий стол, перенаправленный на /desktop/index.html, а доступ к iPhone/Android - /index.html.Nginx conf с использованием IF

В файле conf я использую «IF» и http_user_agent для определения iphone vs desktop, но я заметил, что использование «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, вы увидите, что «если» на самом деле довольно логично, и все возможные проблемы, связанные с ним, можно легко предсказать и избежать.

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

Я просто хочу, чтобы index.html для рабочего стола указывал на /desktop/index.html не весь каталог. – Maca

+0

Я добавил пример того, как это можно сделать в исходном ответе. –

+0

, так что "" будет пустым? – Maca

Смежные вопросы