为静态内容和 php 构建 nginx 配置

为静态内容和 php 构建 nginx 配置

我正在尝试编写具有以下语义的 Nginx 配置,以希望可读的伪配置来表达:

location /dir1/ /dir2/ {
  if (matches a .php file) {
    serve with php
  } else if (matches a non-.php file) {
    serve as static content
  } else {
    404
  }
} else {
  serve with /index.php
}

我该怎么做?我对 Apache 配置有一定了解,但对 Nginx 的了解不够深入,无法理清语义、try_files匹配location和内部重定向等内容。关于如何构建此结构,有什么建议吗?

作为参考,mod_rewrite我目前在 Apache 中使用的基于的配置是

# Any URL not corresponding to a directory gets rewritten to index.php
RewriteCond $1 !^dir1/
RewriteCond $1 !^dir2/
RewriteRule ^(.*)$ ./index.php/$1 [L,QSA]

# Allow access to files in any of the directories
RewriteCond %{REQUEST_FILENAME} -f
RewriteRule ^(.*)$ - [L]

# If either step above resulted in a php file, process it
<FilesMatch "\.php$">
    SetHandler application/x-httpd-php
</FilesMatch>

答案1

您可以使用 try_files 指令来简化此过程(NGINX 就是如此简单)。这允许您在一个语句中级联多个场景。

在您的情况下,由于您想要将任何目录调用重定向到 index.php,您可以让它先尝试特定文件,然后再尝试 index.php:

  尝试文件$uri index.php;

另外我会调整 php 的位置检测:

  位置 ~ ^(.+\.php)(.*)$ {

     [此处阻止您的 fastcgi]

  }

执行此操作后,您不需要“location /”条目。此站点的完整配置将如下所示(我使用的是 php-fpm,您的 php 位置可能有所不同):

服务器 {

     服务器名称www.example.com;
     根/路径/到/docroot;

     access_log /路径/到/日志文件;
     error_log /路径/到/errorlog;

     索引索引.php;

     尝试文件$uri index.php;

     位置 ~ ^(.+\.php)(.*)$ {

            包括 fastcgi_params;
            fastcgi_index索引.php;
            fastcgi_缓冲区 8 16k;
            fastcgi_buffer_大小为32k;                                         
            fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;   
            fastcgi_pass unix:/var/run/php-fpm/php-fpm.sock;                    

      }

}

答案2

在编写配置之前,最好先了解一下 nginx 的工作原理。阅读以下指南和示例:http://wiki.nginx.org/配置

Nginx 配置不是 if-then-else。处理每个请求都有不同的阶段,您只需定义每个阶段的参数即可。

您可以使用这个模板:

location ~ \.php$ {
  fastcgi_pass    unix:/var/run/php/fcgi;
  fastcgi_index   index.php;
  fastcgi_param  SCRIPT_FILENAME  /var/www/localhost/htdocs$fastcgi_script_name;
  include /etc/nginx/fastcgi_params;
}

location / {
   root /some/folder;
   error_page 404 /index.php
}

相关内容