#php #nginx #url-rewriting
Вопрос:
- есть nginx с
php-fpm
установленным. существует подкаталог/shop
сmain.php
внутренней частью. 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. Просто к вашему сведению, вы можете принять ответ , который решит вашу проблему, нажав на галочку. Это указывает широкому сообществу на то, что вы нашли решение, и создает определенную репутацию как для ответчика, так и для вас самих. Нет никаких обязательств делать это.