根据主机重写URL

时间:2019-02-25 15:09:02

标签: nginx url-rewriting

我有一个提供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;
}

1 个答案:

答案 0 :(得分:0)

如评论中所建议,使用不同的server块是解决方案。

以下部分也有问题,即阻塞所有图像请求而不记录它们,这在调试过程中引起了误会:

location ~* \.(jpg|jpeg|gif|css|png|js|ico|html|eof|woff|ttf)$ {
    if (-f $request_filename) {
        expires 30d;
        access_log off;
    }
}