如何在Nginx服务器块中使用匹配的位置作为变量?

时间:2017-10-05 23:50:22

标签: nginx url-rewriting

我有一个像这样的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;
  }
}

有什么想法吗?

1 个答案:

答案 0 :(得分:1)

尝试更改位置块的顺序。

如果您在Nginx Docs中检查位置块的顺序/优先级,则有两条对您的配置很重要的规则:

  1. 如果Nginx找到一个传统的位置块(如/project1/public),它就不会停止搜索,并且会先匹配任何正则表达式和任何更长的常规块

    - >因此,在您的第一个配置中,Nginx首先触发您的php-regex位置,然后执行try_files

  2. 正则表达式按照它们在配置文件中的出现顺序进行检查。正则表达式的搜索在第一次匹配时终止,并使用相应的配置。

    - >在您的第二个配置中,由于首先找到php-regex,因此永远不会使用try_files