Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ssl/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Nginx 如果';重写语句中的s参数$1_Nginx - Fatal编程技术网

Nginx 如果';重写语句中的s参数$1

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的$

我在nginx config中有以下工作代码:

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
应该像嵌套的
位置
块一样执行。这可能会导致在处理指令时产生少量不必要的工作,但这还不足以让人担心。