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