我有一个提供Symfony应用程序的Nginx服务器。
但是此应用可能会收到来自不同主机的请求(目前在/etc/hosts
中进行了模拟),对于每个主机,public
目录中都有一种缓存目录,它们具有自己的名称:
|-src
|-var
|-...
|-public
| |-host1.com
| | |-file1
| | |-file2
| |-host2.com
| | |-file1
| | |-...
URI可以采用以下格式(请注意缺少子目录名称):
https://host1.com/file1
在这种情况下,我希望Nginx检查public/host1.com/file1
是否存在。因此,我需要设置一种从/file1
到/host1.com/file1
的重写规则。
如果该文件存在,则Nginx必须提供它。但是如果不是这样(即https://host1.com/file53
),我希望Nginx重定向到Symfony应用程序,以便该文件可以生成丢失的文件并提供服务。
如何使用Nginx做到这一点?
这是我的尝试。没有注释下方的3行,它可以用作经典服务器。
server {
listen 80;
root /var/www/project/public;
location / {
##############################################
# Here is my try, but Nginx crashes with this:
##############################################
if ($host = "host1.com") {
try_files /host1.com$uri /index.php$is_args$args;
}
try_files $uri /index.php$is_args$args;
}
location ~ ^/index\.php(/|$) {
fastcgi_pass myapp:9000;
fastcgi_split_path_info ^(.+\.php)(/.*)$;
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param DOCUMENT_ROOT $realpath_root;
}
location ~* \.(jpg|jpeg|gif|css|png|js|ico|html|eof|woff|ttf)$ {
if (-f $request_filename) {
expires 30d;
access_log off;
}
}
location ~ \.php$ {
return 404;
}
rewrite_log on;
error_log /var/log/nginx/project_error.log notice;
access_log /var/log/nginx/project_access.log;
}
答案 0 :(得分:0)
如评论中所建议,使用不同的server
块是解决方案。
以下部分也有问题,即阻塞所有图像请求而不记录它们,这在调试过程中引起了误会:
location ~* \.(jpg|jpeg|gif|css|png|js|ico|html|eof|woff|ttf)$ {
if (-f $request_filename) {
expires 30d;
access_log off;
}
}