我有一个像这样的nginx服务器配置:
server {
listen 80;
listen [::]:80;
root /var/www/html;
index index.php index.html index.htm;
server_name example.com www.example.com;
location /project1/public {
try_files $uri $uri/ /project1/public/index.php?$query_string;
}
location /project2/public {
try_files $uri $uri/ /project2/public/index.php?$query_string;
}
location /project3/public {
try_files $uri $uri/ /project3/public/index.php?$query_string;
}
location ~ \.php$ {
include snippets/fastcgi-php.conf;
fastcgi_pass unix:/var/run/php/php7.0-fpm.sock;
}
}
它有效。但是当我尝试使用正则表达式(以下代码)动态执行此操作时,它会下载URL而不是在浏览器中显示它。
server {
listen 80;
listen [::]:80;
root /var/www/html;
index index.php index.html index.htm;
server_name example.com www.example.com;
location ~ ^/([^/]+)/public {
try_files $uri $uri/ /$1/public/index.php?$query_string;
}
location ~ \.php$ {
include snippets/fastcgi-php.conf;
fastcgi_pass unix:/var/run/php/php7.0-fpm.sock;
}
}
有什么想法吗?
答案 0 :(得分:1)
尝试更改位置块的顺序。
如果您在Nginx Docs中检查位置块的顺序/优先级,则有两条对您的配置很重要的规则:
如果Nginx找到一个传统的位置块(如/project1/public
),它就不会停止搜索,并且会先匹配任何正则表达式和任何更长的常规块
- >因此,在您的第一个配置中,Nginx首先触发您的php-regex
位置,然后执行try_files
正则表达式按照它们在配置文件中的出现顺序进行检查。正则表达式的搜索在第一次匹配时终止,并使用相应的配置。
- >在您的第二个配置中,由于首先找到php-regex
,因此永远不会使用try_files