Задать вопрос
@maksimaels

Nginx rewrite — как получить значение нескольких переменных?

Уже третий день пытаюсь понять правила реврайта и как что писать, голова уже не варит.
Подскажите, как получить из адреса вида example.com/123/456 значения 123 и 456.
Т.е. в пхп скрипте надо получить данные по аналогии с example.com/index.php?a=123&b=456. Названия переменных (a и b) - постоянны, их передавать не надо
С одной переменной все ясно - сделал try_files $uri $uri/ /index.php?a=$uri;
для двух надо реврайт делать?
Или это надо средствами самого скрипта реализовывать и обрабатывать значение $_GET['a'], которое сейчас дает /123/456 (т.е. всю строку)
location / {	
                try_files $uri $uri/ /index.php?a=$uri;
                }

location ~ .php$ {
		include             /etc/nginx/conf.d/fastcgi_params.conf;		
               .... другие параметры...			
                }
  • Вопрос задан
  • 4056 просмотров
Подписаться 1 Оценить 1 комментарий
Помогут разобраться в теме Все курсы
  • Stepik
    Основы работы в консоли Linux, настройка сетевых служб (кластер)
    1 неделя
    Далее
  • Skillbox
    Старт в DevOps: системное администрирование для начинающих
    4 месяца
    Далее
  • Учебный центр IBS
    ADM-026 Kubernetes Advanced
    1 неделя
    Далее
Решения вопроса 1
Tark
@Tark
Pyramid'альный мир
Есть три варианта решения этой проблемы, два из них одинаково плохи, а третий универсален.

location / {
    rewrite ^(\d+)/(\d+)$ /index.php?a=$1&b=$2 last;
    .... 
    try_files $uri $uri/ /index.php?a=$uri;
}

Это плохо тем, что для КАЖДОГО запроса будет проверяться, не соответствует ли строка одному из заявленных регекспов. Для каждого запроса, включая стили, скрипты и статику. Насчёт last в рейврайте не уверен.

location ~* /(\d+)/(\d+) {
    rewrite ^(\d+)/(\d+)$ /index.php?a=$1&b=$2 last;
}

location / {
    try_files $uri $uri/ /index.php?a=$uri;
}

Этот способ плох тем, что придётся повторять регексп в локейшне. Насчёт last в реврайте опять же не уверен.

location / {
    try_files $uri $uri/ /index.php?a=$uri;
}

Самый уверсальный способ. Единая точка входа, роутингом рулит PHP. Идеально.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
@ShamblerR
1. (x)(y )никто не отменял $1$2 и тд тоже.
2. SET тоже работает. в чем проблема ?

if ($host ~* ^(www\.)(.+)) {
                set $HBW $2;
                root   /var/www/$HBW/web;

Хотя все это очень странно обычно это делают на стороне php
Опишите что вы хотите получить по итогу конкретную задачу, покане совсем понятно зачем так делать.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы