параметр URI полосы nginx

#php #nginx #url-rewriting

Вопрос:

  1. есть nginx с php-fpm установленным. существует подкаталог /shop с main.php внутренней частью.
  2. main.php работает следующим образом: если запрос есть example.com/shop/product/123 — он запрашивает example.com/shop/main.php?route=/product/123/ (это работает с nginx apache)

вот .htaccess содержание

 RewriteCond %{REQUEST_URI} !.(ico|jpg|png|img)$ 
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule (.*) main.php?route=$1
 

То, что я пытался сделать:

 location ^~ /shop/product {
    try_files $uri $uri/ @rewrite;
}
location @rewrite {
try_files $uri $uri/ /shop/main.php?route=$1 ;
}
 

— это не работает, он возвращает 404

 location /shop {
try_files $uri $uri/ /shop/main.php?route=$uri;
}
 

это возвращает неверную страницу, потому $uri что /shop/product/123

Чего я пытаюсь добиться, так это убрать слово «магазин» из $uri .

Ответ №1:

Использование second try_files вообще не имеет смысла, это просто дополнительные накладные расходы (два stat вызова ядра). Более того, $1 переменная принимает некоторое значение после выполнения некоторого сопоставления с шаблоном регулярного выражения, содержащим пронумерованную группу захвата, что не является заданием для try_files директивы. rewrite Вместо этого используйте директиву:

 location /shop/ {
    try_files $uri $uri/ @rewrite;
}
location @rewrite {
    rewrite ^/shop(/.*) /shop/main.php?route=$1 last;
}
 

Комментарии:

1. Просто к вашему сведению, вы можете принять ответ , который решит вашу проблему, нажав на галочку. Это указывает широкому сообществу на то, что вы нашли решение, и создает определенную репутацию как для ответчика, так и для вас самих. Нет никаких обязательств делать это.