Назад | Перейти на главную страницу

Структурирование конфигурации nginx для статического контента и php

Я пытаюсь написать конфигурацию 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>

Вы можете упростить это (NGINX - это просто), используя директиву try_files. Это позволяет объединить сценарии в один оператор.

В вашем случае, поскольку вы хотите перенаправить любой вызов каталога на index.php, вы можете сначала попробовать конкретный файл, а затем index.php:

  try_files $uri index.php;

Также я бы скорректировал определение вашего местоположения для php:

  location ~ ^(.+\.php)(.*)$ {

     [your fastcgi block here]

  }

При этом вам не нужна запись «местоположение /». Ваша полная конфигурация для этого сайта будет примерно такой (я использую php-fpm, ваше местоположение php может отличаться):

server {

     server_name www.example.com;
     root /path/to/docroot;

     access_log /path/to/logfile;
     error_log /path/to/errorlog;

     index index.php;

     try_files $uri index.php;

     location ~ ^(.+\.php)(.*)$ {

            include fastcgi_params;
            fastcgi_index index.php;
            fastcgi_buffers 8 16k; 
            fastcgi_buffer_size 32k;                                         
            fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;   
            fastcgi_pass unix:/var/run/php-fpm/php-fpm.sock;                    

      }

}

Лучше получить общее представление о том, как работает nginx, прежде чем писать для него конфиг. Прочтите инструкции и примеры из http://wiki.nginx.org/Configuration

Конфигурация 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
}