Підстановочний / Ngex підказки в шляху розташування


22

Конфігурація Nginx у мене кидає 404 для .php:

## Any other attempt to access PHP files returns a 404.
location ~* ^.+\.php$ {
    return 404;
}

Однак у мене є якийсь файл index.php у підпапці, який я хочу запустити. Поточний конфігурація виглядає так:

location = /sitename/subpage/index.php {
    fastcgi_pass phpcgi; #where phpcgi is defined to serve the php files
}

location = /sitename/subpage2/index.php {
    fastcgi_pass phpcgi; 
}

location = /sitename/subpage3/index.php {
    fastcgi_pass phpcgi; 
}

вона працює чудово, але проблема - це повторювані місця, і якщо є багато підсторінок, то конфігурація стає величезною.

Я спробував підстановку як * і деякий регулярний вираз, який говорить, що тест nginx пройшов, але не завантажує сторінку, тобто 404. Що я спробував, це:

location = /sitename/*/index.php {
    fastcgi_pass phpcgi;
}

location ~* ^/sitename/[a-z]/index.php$ {
    fastcgi_pass phpcgi;
}

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

Відповіді:


32

=Модифікатора в locationблоці точний збіг, без яких - або групових символів, зіставлення префікса або регулярних виразів. Ось чому це не працює.

У вашій спробі регулярного вираження [a-z]збіг одного символу між aта z. Ось чому це не працює для вас.

Потрібно налаштувати свої місцезнаходження таким чином. Зверніть увагу на порядок locationвисловлювань. nginx вибирає першу відповідну умову регулярного виразів.

location ~ ^/sitename/[0-9a-z]+/index.php$ {
    fastcgi_pass phpcgi;
}

location ~ \.php$ {
    return 404;
}

Я використовую тут відповідність регістру ( ~замість ~*) модифікатор . У першому випадку я збігаю першу частину шляху, потім одну чи більше цифр з алфавіту / числа та потім index.php. Ви можете змінювати діапазон відповідності, але пам’ятайте про +повторення «один чи більше».

Другий відповідає будь-якому URI, який закінчується .php. Вам не потрібні зайві символи у вашій версії через те, як працюють регулярні вирази.


спасибі, так, головне, що повторення не було в регексе. +виправили це.

1

Порядок важливий, з опису "місцезнаходження" nginx :

Щоб знайти місце, яке відповідає заданому запиту, nginx спочатку перевіряє місця, визначені за допомогою рядків префікса (префікса місця). Серед них вибирається та запам'ятовується місце з найдовшим відповідним префіксом. Потім перевіряються регулярні вирази в порядку їх появи у файлі конфігурації. Пошук регулярних виразів закінчується в першій відповідності, і використовується відповідна конфігурація. Якщо не знайдено збігу з регулярним виразом, тоді використовується конфігурація пам'яті, що запам'ятовувалася раніше.

Це означає:

  • По-перше =. (відповідність "найдовшого префікса")
  • Потім неявні. (відповідність "найдовшого префікса")
  • Потім повторно виражати. (перший матч)

Потрібно відрегулювати порядок деталей регулярних виразів.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.