我正在尝试编写具有以下语义的 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
}