как удалить блок местоположения из $ uri в конфигурации nginx?

16

У меня есть переписать в моем файле конфигурации ngix, который работает должным образом, за исключением того, что он включает в себя блок location как часть переменной $ 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 и т. Д., Но я не могу найти ни одного примера, чтобы сделать просто присвоение переменной с использованием регулярного выражения, которое не является частью перезаписи заявление. Я искал и пытался часами, и я просто не могу пройти этот последний шаг.

Я также знаю, что мог бы просто удалить это из кода приложения, но причина, по которой я хочу попытаться исправить это в conf nginx, заключается в соображениях совместимости, так как он также работает на Apache. Я также должен сказать, что я нашел действительно хакерский способ сделать это, но он включает в себя оператор «если», чтобы проверить наличие файлов, и в документации, в частности, сказано, чтобы не делать это таким образом.

Джейсон
источник

Ответы:

18

Оглядываясь вокруг, я догадываюсь, что использование регулярного выражения с захватами является самым простым. Адаптируя ваш пример, я получаю:

location ~ ^/cargo(.*) {
    try_files $1 $1/ /cargo/index.php?_REWRITE_COMMAND=$1&args;
}
Theuni
источник
ага, так просто, когда кто-то указывает вам на это! Мне пришлось сделать несколько небольших изменений, чтобы переписать корневой URL в правильное место. Я поставил ответ в вопросе, так как я не могу сделать никакого форматирования в этом комментарии. Единственное предостережение, которое осталось, заключается в том, что блок php теперь должен находиться над этим блоком местоположения, иначе будет создан бесконечный цикл перенаправления (поскольку / cargo является регулярным выражением, а URL-адрес перенаправления также содержит / cargo). не уверен, есть ли другой способ предотвратить это?
Джейсон
Я рекомендую ознакомиться с порядком расположения регулярных выражений и не-регулярных выражений. Я обычно обращаюсь к тому, чтобы сделать все места регулярными выражениями в какой-то момент, потому что тогда порядок определяется порядком в файле конфигурации, а не спецификой совпадения.
Theuni
круто спасибо, я представлял, что могло бы сделать вышеприведенное регулярное выражение лучше, если бы оно совпадало с / cargo / (что угодно, кроме index.php), тогда это предотвратило бы ошибку сервера из-за бесконечного цикла перезаписи.
Джейсон
3

Я нашел другую вещь, которая работала для меня (так как я использую Gunicorn, я не могу выбрать, что проходить)

Вы должны быть в состоянии сойти с рук

location /cargo {
    rewrite ^/cargo(.*)$ $1 break;
    try_files $uri $uri/ /cargo/index.php?_REWRITE_COMMAND=$uri&args;
}
g3rv4
источник
1

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

location ^~ /api {
        rewrite ^/api(/.*)$ $1 break;
        proxy_pass    http://127.0.0.1:3001/;
    }
Джордж Милонас
источник