Nginx 1.10.3 Ubuntu, стандартная установка apt. index index.php;
расположен снаружи server
блок.
Я нуждаюсь:
http://example.com/test/1
указывает на /var/www/example.com/test/1
http://example.com/test/2
указывает на /var/www/example.com/test/2
..и так далее.
Поскольку я создам слишком много тестов, мне нужен подстановочный знак для try_files
. Сейчас я обхожусь без подстановочного знака:
server {
server_name example.com;
root /var/www/example.com;
location /test/1/ {
try_files $uri $uri/ /test/1/index.php?$args;
}
location /test/2/ {
try_files $uri $uri/ /test/2/index.php?$args;
}
location ~ \.php$ {
...
}
Из многих рекомендаций ни одна не работает.
Обычный PHP работает нормально. WordPress и Laravel выдали «Файл не найден»:
server {
server_name example.com;
location ~ ^/test/(?<content>.+)$ {
root /var/www/example.com/test/$content;
try_files $uri $uri/ /index.php?$args;
}
location ~ \.php$ {
...
}
Файл не найден:
server {
server_name example.com;
location ~ ^/test/(?<content>[^/]+) {
root /var/www/example.com/test/$content;
try_files $uri $uri/ /index.php?$args;
}
location ~ \.php$ {
...
}
Во всех приведенных ниже попытках он загружает файл PHP вместо запуска PHP:
server {
server_name example.com;
root /var/www/example.com;
location ~ /(?<content>[^/]+) {
try_files $uri $uri/ /$content/index.php?$args;
}
location ~ \.php$ {
...
}
server {
server_name example.com;
root /var/www/example.com;
location ~ /(.*)/ {
try_files $uri $uri/ /$1/index.php?$args;
}
location ~ \.php$ {
...
}
server {
server_name example.com;
root /var/www/example.com;
location ~ /test/(?<content>[^/]+) {
try_files $uri $uri/ /test/$content/index.php?$args;
}
location ~ \.php$ {
...
}
server {
server_name example.com;
root /var/www/example.com;
location ~ /test/(?<content>.+) {
try_files $uri $uri/ /test/$content/index.php?$args;
}
location ~ \.php$ {
...
}
Если можно, готов отдать 10 долларов за правильный ответ
Регулярное выражение location
блоки оцениваются по порядку, поэтому .php
блок должен быть помещен перед /test/...
блок, иначе .php
файлы под /test/
будет загружен, а не выполнен. Видеть этот документ для подробностей.
Ваша лучшая версия была второй после последней. Регулярное выражение извлекает только элемент пути, следующий за /test/
префикс.
Просто переверните location
блоки. Например:
server {
server_name example.com;
root /var/www/example.com;
location ~ \.php$ {
...
}
location ~ /test/(?<content>[^/]+) {
try_files $uri $uri/ /test/$content/index.php?$args;
}
}