【发布时间】:2016-05-27 18:19:42
【问题描述】:
我有一个问题,我想将除 www 之外的所有子域重写到特定文件夹。 问题是这是在一个 docker 容器内运行的,它有一个外部卷和不同主机的动态主机名。所以我必须使用 $hostname。 只要您使用 $hostname,它就会受到与正则表达式规则相同的威胁。因此,为 www 创建一条规则不起作用,因为它对 www.$hostname 和 *.$hostname 或那里的正则表达式具有相同的威胁。
我尝试了多种方法,直接从 server_name 的变量中提取它根本不起作用,我现在处于一个带有负前瞻的条件正则表达式,它在任何正则表达式测试器上都可以正常工作,但在 ngnix 中却不行 2016/02/16 12:28:14 [emerg] 1#0: /etc/nginx/sites-enabled/default:10 中的无效条件“(?!www.)(\w”
有人有什么想法吗?
server {
listen 443 ssl;
listen 80;
server_name *.$hostname;
error_log /var/log/nginx/rewrite.log debug;
root /src/webapp/dist;
ssl_certificate /etc/nginx/ssl/server-cert.pem;
ssl_certificate_key /etc/nginx/ssl/server-key.pem;
if ($http_host ~ ((?:\w+(?:-\w+)*\.)*)((?!www\.)\w+(?:-\w+)*)(\.$hostname)) {
set $subdomain $1;
return 301 $scheme://www.$hostname/#/$subdomain/media/portfolio/1;
break;
}
}
也在块下面进行了测试,同样的结果根本没有重定向工作,它再次位于带有 ngninx 1.4.6-1ubuntu3.4 的 docker 容器内:
server {
listen 80;
listen 443 ssl;
server_name www.$hostname;
root /src/webapp/dist;
ssl_certificate /etc/nginx/ssl/server-cert.pem;
ssl_certificate_key /etc/nginx/ssl/server-key.pem;
}
server {
listen 80;
listen 443 ssl;
server_name *.$hostname;
ssl_certificate /etc/nginx/ssl/server-cert.pem;
ssl_certificate_key /etc/nginx/ssl/server-key.pem;
return 301 $scheme://www.$hostname/#/media/portfolio/1;
}
【问题讨论】: