як видалити блок розташування з $ uri в конфігурації nginx?


16

У моєму файлі ngix conf є перезапис, який працює належним чином, за винятком того, що він містить блок розташування як частину змінної $ uri. Я хочу лише шлях після блоку розташування. Мій поточний код конфігурації:

location /cargo {
    try_files $uri $uri/ /cargo/index.php?_REWRITE_COMMAND=$uri&args;
}

Використовуючи приклад URL-адреси http://localhost/cargo/testpageпереадресації, проте значення параметра "_REWRITE_COMMAND", отриманого моїм файлом php, є "/ cargo / testpage". Мені потрібно зняти блок розташування і просто "тестувати" як $ uri

Я майже впевнений, що існує синтаксис регулярного виразка, щоб розділити $ uri і призначити його новій змінній за допомогою $ 1 $ 2 і т.д. заява. Я шукав і намагався годинами, і я просто не можу, здається, пройти цей останній крок.

Я також знаю, що міг би просто зняти це з коду програми, але причиною, яку я хочу спробувати виправити в конфіденційності nginx, є причини сумісності, оскільки він також працює на Apache. Я також повинен сказати, що я з'ясував дійсно хакітний спосіб зробити це, але він включає в себе заяву "якщо" для перевірки наявності файлів, а документація спеціально говорить, що не робити це так.

Відповіді:


18

Озираючись навколо, я б здогадався, що використовувати місце розташування з захопленнями - це найпростіше. Пристосовуючи ваш приклад, я закінчую:

location ~ ^/cargo(.*) {
    try_files $1 $1/ /cargo/index.php?_REWRITE_COMMAND=$1&args;
}

ага, так просто, коли хтось вам це вказує! Мені довелося зробити кілька незначних змін, щоб обробити кореневе переписування URL-адреси в потрібне місце. Я поставив відповідь у питанні, оскільки я не можу робити жодного форматування в цьому коментарі. Єдиний застереження, що блок php тепер повинен бути вище цього блоку розташування, або ж створюється нескінченний цикл переадресації (через / вантаж є регулярним виразом, а URL-адреса переадресації також містить / вантаж). не впевнений, чи є інший спосіб запобігти цьому?
Джейсон

Рекомендую ознайомитись із впорядкуванням розташування regexp та non-regexp. Зазвичай я звертаюсь до того, щоб зробити всі місця повторного виразу в якийсь момент, тому що впорядкованість визначається порядком у конфігураційному файлі, а не специфікою відповідності.
Теуні

класно дякую, я уявляв собі, що зробить регулярний вираз краще, якби він відповідав / load / (що завгодно, крім index.php), то це запобігло б помилку сервера через нескінченний цикл перезапису.
Джейсон

3

Я знайшов ще одну річ, яка працювала на мене (оскільки я використовую рушницю, я не можу вибрати, що пройти)

Ви повинні мати можливість піти

location /cargo {
    rewrite ^/cargo(.*)$ $1 break;
    try_files $uri $uri/ /cargo/index.php?_REWRITE_COMMAND=$uri&args;
}

1

Для тих, хто, можливо, намагається додати його для мікропослуг або API з Node JS, я використовував наступне для видалення apiз URL-адреси на своєму сервері:

location ^~ /api {
        rewrite ^/api(/.*)$ $1 break;
        proxy_pass    http://127.0.0.1:3001/;
    }
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.