Я конвертирую устаревший сервер 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$
(требуется тестирование)