使用 Nginx 将 URL 组件/路径传递给 PHP

使用 Nginx 将 URL 组件/路径传递给 PHP

我最近从 Apache 切换到 Nginx。我是 Nginx 的新手,所以请多多包涵。我的一个应用程序使用第一个 URL 组件作为查询字符串,除非路径/文件存在 - 在这种情况下 Apache 会提供该文件。以前,我会将 URL 路径中的第一个字符串传递给 PHP,例如 example.com/foo(传递 foo)。我的旧 .htaccess 如下所示:

<IfModule mod_rewrite.c>

   RewriteEngine On

   RewriteBase /

   # if file or directory exists, serve it   
   RewriteCond %{REQUEST_FILENAME} -f [OR]
   RewriteCond %{REQUEST_FILENAME} -d
   RewriteRule .* - [S=3]
   # if not, pass the url component to PHP as the "section" query string
   RewriteRule ^([^/]+)/?$ ?section=$1 [L]

</IfModule>

我在 Nginx 中尝试了很多东西,但因为我太新了,所以我陷入了困境。这似乎最接近我想要的:

server {

  root /var/www/mysite.com;

  index index.php;
  server_name www.mysite.com mysite.com;

  location ~ \.php$ {
    include snippets/fastcgi-php.conf;
    fastcgi_pass unix:/run/php/php7.0-fpm.sock;
  }

  location / {
    rewrite ^/(.*)$ /index.php?section=$1 break;
    try_files $uri $uri/ /index.php$args;
  }

}

但是,查询字符串似乎没有传递到我的index.php脚本。

我已经审查了以下其他问题:

如果有人比我更了解 Nginx,能够帮助我,我将永远感激不尽。

答案1

我最终用了一个命名位置。这个功能确实有用,但我仍然觉得还有更好的解决方案。

server {

  root /var/www/mysite.com;

  index index.php;
  server_name mysite.com;

  location ~ \.php$ {
    include snippets/fastcgi-php.conf;
    fastcgi_pass unix:/run/php/php7.0-fpm.sock;
  }

  location / {
    try_files $uri $uri/ @fallback;
  }

  location @fallback {
    rewrite ^/(.*)$ /index.php?section=$1 last;
  }

}

答案2

在 nginx 中执行此操作的更本地的方法是:

server {
    root /var/www/mysite.com;
    index index.php;
    server_name example.com;

    location ~ \.php$ {
        include snippets/fastcgi-php.conf;
        fastcgi_pass unix:/run/php/php7.0-fpm.sock;
    }

    location /(.*) {
        try_files $uri $uri/ /index.php?section=$1;
    }

相关内容