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 долларов за правильный ответ.
решение1
Блоки регулярных выражений 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;
}
}