我使用下面的配置。它可以工作,但对我来说问题是重复了一些行。指令也proxy_*
需要在里面,因为每个请求 nginx 只会执行一个。我有什么选项可以删除这个重复的代码,而不将其提取到新文件并在之后包含它?location /admin
location
是否有一个选项可以告诉 nginx 在选择并处理location @rails
后继续?location /admin
location @rails
啊,顺便问一下,和有什么区别location /
?
server {
...
location /admin {
include /etc/nginx/force_ssl;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $http_host;
proxy_redirect off;
proxy_pass http://rails;
}
location @rails {
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $http_host;
proxy_redirect off;
proxy_pass http://rails;
}
...
}
在/etc/nginx/force_ssl中:
if ( $scheme = "http" ) {
rewrite ^/(.*)$ https://$host/$1 permanent;
}
答案1
您问了多个问题。
对于第一个问题,如何消除冗余:
一般来说,您可以将配置文件的任何部分移动到单独的文件中,然后使用include
指令将其包含一次或多次。include 指令
关于从一个位置重定向到另一个位置的第二个问题:
使用rewrite
指令,您可以从另一个位置调用一个位置。Nginx 内部将创建第二个请求来处理被调用的位置,但用户看不到任何内容。使用last
重写目标后的关键字,您可以告诉 Nginx 此时停止处理规则,并根据当前的内容选择下一个位置$uri
,此变量包含所有已执行重写的结果。因此,例如,如果您只想将所有内容重定向到,@rails
您可以使用这样的规则将任何 URL 重写到@rails
,然后last
告诉 Nginx 查找名称为的位置@rails
:
rewrite . @rails last;
详细信息如下:重写模块
在第三个问题中,您询问这两个地点之间是否存在差异@rails
:/admin
根据您发布的片段,我无法告诉您。我只看到 比/admin
包含的文件多一个@rails
。因此,这个问题的答案取决于您的后端应用程序和其余 Nginx 配置的上下文。