@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;		
               .... другие параметры...			
                }
  • Вопрос задан
  • 3975 просмотров
Решения вопроса 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
Опишите что вы хотите получить по итогу конкретную задачу, покане совсем понятно зачем так делать.
Ответ написан
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы