Nginx 如果';重写语句中的s参数$1
我在nginx config中有以下工作代码:Nginx 如果';重写语句中的s参数$1,nginx,Nginx,我在nginx config中有以下工作代码: if ($http_host ~* ^www\.(.+)$) { set $host2 $1; rewrite (.*) http://$host2$1; } 我认为字符串设置$host2$1可以省略,在重写语句中使用$1,而不定义一些变量。但是rewrite有自己的$1..$9参数 如果在rewrite语句中使用$1格式,我将如何使用?我认为正则表达式美元格式只适用于最新的正则表达式。因此,如果不使用set,则无法将if的$
if ($http_host ~* ^www\.(.+)$) {
set $host2 $1;
rewrite (.*) http://$host2$1;
}
我认为字符串设置$host2$1代码>可以省略,在重写语句中使用$1,而不定义一些变量。但是rewrite有自己的$1..$9参数
如果在rewrite语句中使用$1格式,我将如何使用?我认为正则表达式美元格式只适用于最新的正则表达式。因此,如果不使用set
,则无法将if
的$1
与rewrite
的$1
组合在一起。但是,对于您的场景有更简单的解决方案
首先,如果您知道主机名(例如example.com
),可以执行以下操作:
server {
server_name www.example.com;
return 301 $scheme://example.com$request_uri;
}
server { server_name example.com; ... }
另一方面,如果您心中没有特定的主机名,则可以执行以下全面解决方案:
server {
server_name ~^www\.(?<domain>.+)$;
return 301 $scheme://$domain$request_uri;
}
server { server_name _; ... }
服务器{
服务器名称^ www.(?.+)$;
返回301$scheme://$domain$request\u uri;
}
服务器{server\u name}
您可以了解有关第二种形式的更多信息
我不建议采用“一网打尽”的解决方案,因为最多只有一个“一网打尽”的服务器块才有意义。如果可能,请使用命名服务器解决方案
另外,请注意,您可以使用rewrite^目标永久地址实现上述重定向代码>表单。所有这些解决方案都避免使用不受重视的if
指令。以前从来没有想过通用的“一网打尽”解决方案,总是使用第一种方法(301重定向)和硬编码域名,谢谢提示。@MohammadAbuShady:-)在这个配置中,我有一个服务器块,服务器名称中有ip地址。此服务器通过drupal多站点功能托管许多站点。这就是为什么我寻求在一个指令中配置服务器的方法,而不在config中指定主机名。谢谢你的回答,我会在我的服务器上试试。你的配置比我的版本好吗?(我知道if是邪恶的,但配置的性能如何)@AlexeyPavlov你的if
应该像嵌套的位置
块一样执行。这可能会导致在处理指令时产生少量不必要的工作,但这还不足以让人担心。