Як працюють try_files?


72

Я переглянув документацію nginx, і вона все ще мене абсолютно бентежить.

Як try_filesпрацює? Ось що говорить документація:

Від NginxHttpCoreModule

try_files

синтаксис: try_files path1 [path2] uri

за замовчуванням: жоден

контекст: сервер, місцезнаходження

наявність: 0.7.27

Перевіряє наявність файлів у порядку і повертає перший знайдений файл. Косою косою рисою вказується на каталог - $ uri /. У разі, якщо не знайдено жодного файлу, викликається внутрішнє переадресація на останній параметр. Останній параметр - резервний URI і повинен існувати, інакше буде піднята внутрішня помилка. На відміну від переписати, $ аргументи не зберігаються автоматично, якщо резервна копія не є названим місцем. Якщо вам потрібні аргументи, збережені, ви повинні зробити це явно:

Я не розумію, як він перевіряє шляхи і що робити, якщо я не хочу внутрішньої помилки, але чи відновити це решту шляху, намагаючись знайти інший файл?

Якщо я хочу спробувати кешований файл у, /path/app/cache/url/index.htmlі якщо він не вдається спробувати, /path/app/index.phpяк би це записати? Якби я написав:

try_files /path/app/cache/ $uri
include /etc/nginx/fastcgi_params;
fastcgi_pass unix:/var/run/php-fastcgi/php-fastcgi.socket;
fastcgi_param SCRIPT_FILENAME $document_root/index.php;

Я маю index index.php index.html index.htm;. Коли я приїжджаю /urlname, він буде намагатися перевірити /path/app/cache/urlname/index.phpто /path/app/cache/urlname/index.html? Якщо ми ігноруємо все після того try_files, чи можна try_filesперевірити папку кеша? Я намагався і не вдався.

Відповіді:


64

try_files пробує вказаний вами буквальний шлях відносно визначеної кореневої директиви та встановлює внутрішній покажчик файлу. Якщо ви використовуєте, наприклад , try_files /app/cache/ $uri @fallback;з index index.php index.html;потім буде перевіряти шляху в наступному порядку:

  1. $document_root/app/cache/index.php
  2. $document_root/app/cache/index.html
  3. $document_root$uri

перш ніж остаточно внутрішньо переадресувати на ім'я @fallback з ім’ям Ви також можете використовувати файл або код статусу ( =404) як ваш останній параметр, але якщо використовується файл, він повинен існувати .

Слід зазначити, що сам try_files не видасть внутрішнього переспрямування ні на що, крім останнього параметра. Значить, ви не можете зробити наступне: try_files $uri /cache.php @fallback;оскільки це призведе до того, що nginx встановить внутрішній покажчик файлу на $ document_root / cache.php і обслуговує його, але оскільки не відбувається внутрішнього переадресації, місця не повторно оцінюються, і як таке воно буде служив як звичайний текст. (Причина, по якій працює з PHP - файлів в якості індексу є те , що директива індекс буде видавати внутрішній редирект)


2
Це набагато зрозуміліше. Дякую. Я трохи не впевнений, як працює названа локація. Якщо у @fallback є рядки для fastcgi php, які б слугували нею як файлом php, а не текстом? Чи використовується резервна копія, коли все, перш ніж вона виходить з ладу?

2
Іменоване місце розташування просто функціонально ідентичне звичайному розташуванню, за винятком того, що доступ до нього можна отримати лише за допомогою внутрішніх механізмів, таких як сторінка помилок та try_files. Резервна копія у try_files використовується лише тоді, коли жоден із зазначених шляхів не приводить до дійсного файлу. Вам все-таки потрібне місце для лову \ .php $ URI, оскільки в іншому випадку try_files запустить на $ uri, якщо файл існує та слугуватиме ним як звичайний текст.
Мартін Фьордвальд

Дякую за цю відповідь. У мене все ще виникає запитання: чи буде виконано try_files відразу чи буде введене розташування спробувати раніше?
Стфан

@Stphane Ви переїжджаєте тут у каламутні води. Спадкування в nginx є складним, безладним і цілком непослідовним. Мені довелося переглянути свої старі нотатки просто для того, щоб пам’ятати про це, тому жодних гарантій, але, схоже, що для try_files, зокрема, якщо стосується лише вкладених локацій, він не буде виконуватись, якщо внутрішнє розташування збігається. Я б рекомендував протестувати його.
Мартін Фьордвальд

5

Ось ще одне зручне використання try_files як безумовного переадресації на названі місця. Названі локації ефективно діють як підпрограми, економлячи дублювання коду. Коли перший аргумент try_files є "_", завжди приймається резервне переадресація.

    location =/wp-login.php { try_files _ @adminlock; }
    location ^~ /wp-admin/  { try_files _ @adminlock; }
    location @adminlock  {
            allow 544.23.310.198;
            deny all;
            try_files _ @backend;
            # wp-admin traffic is tiny so ok to send all reqs to backend 
    }
    location ~ \.php {  try_files _ @backend; }
    location / { try_files $uri $uri/ =403; }
    location @backend {
            fastcgi_pass 127.0.0.1:9000;
            include snippets/fastcgi-php.conf;
    }
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.