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

Может ли Nginx обрабатывать запросы php (или аналогичные fcgi) внутри псевдонима?

Я конвертирую устаревший сервер Apache в Nginx и не могу позволить себе изменить URL-адрес или переупорядочить файловую систему.

Можно ли использовать вложенные блоки location {} в конфигурации Nginx, чтобы указать ему передавать файлы .php в каталоге с псевдонимом в fastcgi при обычном обслуживании статического содержимого?

Конфигурация, похожая на ту, что меня не подводит:

server {
  listen 80;

  location / {
    index  index.html;
  }

  location /foosite/ {
    alias  /var/aliases/foo;
    location ~ \.php$ {
      include fastcgi_params;
      fastcgi_param   SCRIPT_FILENAME $document_root$fastcgi_script_name;
    }
  }
}

Запросы для /foosite/static.jpg обслуживаются нормально, но nginx, похоже, искажает путь к любым файлам .php при попытке отправить их в fastcgi.

Предлагаемое здесь решение не является решением. И это уже не правильно. Используя Lucid (10.4), я смог использовать это решение. Проблема с решением womble в том, что оно не устанавливает DOCUMENT_ROOT параметр правильно; скорее, он включает имя сценария в document_root.

Кажется, это работает нормально.

location /foosite {
    alias /home/foosite/www/;
    index index.php index.html index.htm;

    location ~ /foosite/(.*\.php)$ {
        fastcgi_pass   127.0.0.1:9000;
        fastcgi_index  index.php;
        fastcgi_param  SCRIPT_FILENAME  $document_root$1;
        include /etc/nginx/fastcgi_params;            
    }                                                 
}

С помощью nginx/0.7.65

Насколько я могу судить, "искажение", о котором вы говорите, является ошибкой в ​​nginx, связанной с вложенными блоками местоположения (или, возможно, псевдонимами в блоках местоположения, которые выполняют сопоставление на основе регулярных выражений без захвата ... Я не уверен) . Однако то, что я смог сделать, было довольно простым.
Во-первых, вы можете указать все свои параметры fastcgi, включая fastcgi_pass линия и fastcgi_param SCRIPT_FILENAME $request_filename в отдельный файл для включения в соответствующие разделы сайта. Я положил свой /etc/nginx/fragments/php.

Тогда для /foosite, вам нужно два блока местоположения, например:

location /foosite {
    alias /var/aliases/foo;
}

location /foosite(.*\.php)$ {
    alias /var/aliases/foo$1;
    include /etc/nginx/fragments/php;
}

Здесь следует опасаться - в отличие от "обычных" блоков местоположения, похоже, что сопоставление на основе регулярных выражений выполняется в порядке, указанном в файле конфигурации (не самое длинное совпадение сначала, как, по-видимому, имеет место для не-регулярного выражения блоки локации). Итак, если вы используете местоположение PHP для конкретного сайта, а также общий обработчик PHP для всех сайтов (location ~ \.php$), то вам нужно будет поместить общий обработчик "для всех сайтов" последний в серверном блоке, или весь ад вырвется наружу.

Да, это отстой, и если у меня появится мотивация, я могу попытаться выяснить, что именно не так с вложенным случаем (анализатор конфигурации не блокирует его, поэтому я подозреваю, что он должен работать, но на самом деле никто не использует его, так что глючит).

AFAIK, вы не можете использовать вложенные блоки.

Вместо этого попробуйте что-нибудь вроде следующего.

location / {
  root /var/www;
  access_log off;

  index index.php index.html;
  expires 1d;

  try_files $uri $uri/ /index.php?q=$uri;
}

location ~ \.php$ {
  fastcgi_pass   127.0.0.1:9000;
  fastcgi_index  index.php;
  fastcgi_buffer_size 128k;
  fastcgi_buffers 4 256k;
  fastcgi_param  SCRIPT_FILENAME  /var/www$fastcgi_script_name;
  include        /usr/local/nginx/conf/fastcgi_params;
}

Вы можете изменить второй блок, чтобы он выглядел примерно так:

location ~ /foosite/.*php$

(требуется тестирование)