Apache 在动态主机上重写为 nginx

Apache 在动态主机上重写为 nginx

我读了一些资料,但找不到问题的答案,因为它有一个关键部分与大多数情况不同。它的开头与其他故事一样:我需要将 .htaccess 迁移到 nginx 配置中,如果不是因为这个,这会很简单:nginx 服务器设置为使用动态主机:

server {
    listen 80;

    server_name ~^(www\.)?(?<sname>.+?).server.company.com$;
    root /var/www/$sname/current/public;
    index index.html index.htm index.php;

    location / {
        try_files $uri $uri/ /index.php$is_args$args;
    }

    location ~* \.(gif|png|bmp|ico|flv|swf|exe|html|htm|txt|css|js) {
        add_header        Cache-Control public;
        add_header        Cache-Control must-revalidate;
        expires           7d;
    }

    location ~ \.php$ {

        fastcgi_pass unix:/var/run/php/php7.1-fpm.sock;
        include fastcgi_params;
        fastcgi_param DOCUMENT_ROOT $realpath_root;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        fastcgi_index index.php;
    }

    location ~ /\.ht {
        deny all;
    }
}

这样做是为了根据其目录在单个子域上运行多个项目。问题是其中一个项目(我们称之为 theproject.domain.company.com)是一个非常古老的庞然大物,它使用 .htaccess 进行大量重定向。我可以为这些重定向创建位置块,但我不知道如何将它们仅应用于该项目(我对 nginx 不是很有经验)。

我愿意接受任何可能的解决方案,我的理论是:

1)目录特定的 nginx 配置 - 有点像 htaccess,但不确定 nginx 是否能够动态加载配置

2)使用 if 块来表示特定的服务器名称,但不确定语法,因为我找不到任何使用 if 来表示服务器名称的示例

3)为该子域名单独设置虚拟主机,这是一个可行的方案,尽管对于我的问题来说这不是一个很优雅的解决方案,问题是我不知道如何设置优先级,因为该子域名将匹配动态虚拟主机的相同模式

非常感谢任何帮助、建议或链接

答案1

选项 (3) 降低了仅为修复一个恶意子域名而破坏所有子域名的风险。具有完全匹配的server块将始终优先于正则表达式。请参阅server_nameserver_name这个文件了解详情。

如果您想尽量减少重复配置,请将常用语句卸载到单独的文件中,然后使用语句将其拉入include

例如:

server {
    listen 80;
    server_name www.theproject.server.company.com theproject.server.company.com;

    root /var/www/theproject/current/public;

    #
    # ... statements to fix "theproject"
    #

    include /path/to/common/config;
}

server {
    listen 80;
    server_name ~^(www\.)?(?<sname>.+?).server.company.com$;

    root /var/www/$sname/current/public;
    include /path/to/common/config;
}

相关内容