我读了一些资料,但找不到问题的答案,因为它有一个关键部分与大多数情况不同。它的开头与其他故事一样:我需要将 .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_name
server_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;
}