Redirect Gitlab Omnibus:如何使用捆绑的nginx重写URL 当前配置
我将GitLab迁移到了一个新服务器。作为迁移的一部分,一些存储库被重新组织。我们有一个网站可以直接链接到GitLab上的原始和blob文件。对于这些原始和blob文件,我想将所有HTTPS请求从旧URL重定向到新URL 我使用Gitlab Omnibus包,并附带nginx安装。我基于对这个问题的公认答案:,这反过来又引用了官方的GitLab文档:Redirect Gitlab Omnibus:如何使用捆绑的nginx重写URL 当前配置,redirect,nginx,gitlab,gitlab-omnibus,Redirect,Nginx,Gitlab,Gitlab Omnibus,我将GitLab迁移到了一个新服务器。作为迁移的一部分,一些存储库被重新组织。我们有一个网站可以直接链接到GitLab上的原始和blob文件。对于这些原始和blob文件,我想将所有HTTPS请求从旧URL重定向到新URL 我使用Gitlab Omnibus包,并附带nginx安装。我基于对这个问题的公认答案:,这反过来又引用了官方的GitLab文档: 创建nginx config目录,因为它还不存在: sudo mkdir-p/etc/nginx/conf.d/ 创建/etc/nginx/con
sudo mkdir-p/etc/nginx/conf.d/
/etc/nginx/conf.d/redirect.conf
:/etc/gitlab/gitlab.rb上的配置文件,添加以下行:
nginx['custom\u nginx\u config']=“include/etc/nginx/conf.d/redirect.conf;”“
sudo gitlab ctl重新配置
rewrite ^\/itext7\/samples\/(blob|raw)\/master\/(?!samples\/)(.*)$ https://$server_name/itext7/samples/$1/master/samples/$2 permanent;
sudo gitlab ctl重启nginx
sudo grep'redirect.conf'/var/opt/gitlab/nginx/conf/nginx.conf
/samples
在/blob/master
之后插入。我希望看到301重写成https://gitlab.itextsupport.com/itext/tutorial/blob/master/samples/signatures/src/main/java/signatures/chapter4/C4_05_SignWithBEID.java
实际结果
在未修改的URL上200 OK
丑陋的黑客
将此行添加到/var/opt/gitlab/nginx/conf/gitlab http.conf
并重新启动捆绑的nginx:
rewrite ^\/itext7\/samples\/(blob|raw)\/master\/(?!samples\/)(.*)$ https://$server_name/itext7/samples/$1/master/samples/$2 permanent;
通过这样做,我已经验证了我的实际重写规则本身是正确的
缺点:每次运行gitlab ctl reconfigure
时,该行都会丢失
问题:
要使URL重写按预期工作,我需要做哪些更改?没有丑陋的黑客
补充资料
当我运行
sudo/opt/gitlab/embedded/sbin/nginx-p/var/opt/gitlab/nginx-T
时,我看到两个server{}
块。到目前为止,我的工作原理是nginx只接收第一个服务器块,而忽略第二个服务器块。如果我能找到一种方法来合并这两个服务器块,以一种与配置文件兼容的方式,那么我的问题很可能就解决了。好吧,看起来答案就在gitlab.rb
中盯着我看。在nginx['custom\u nginx\u config']
上方的一行是nginx['custom\u gitlab\u server\u config']
。我将include语句放在那里,并删除了重写规则周围的server{}
括号。GitLab文档中也介绍了这一点,网址为:
这会将定义的字符串插入/var/opt/gitlab/nginx/conf/gitlab http.conf
的服务器块末尾
这就是我所做的:
/etc/gitlab/gitlab.rb
中,注释掉nginx['custom\u nginx\u config']
行并添加:
nginx['custom\u gitlab\u server\u config']=“include/etc/nginx/conf.d/redirect.conf;”
/etc/nginx/conf.d/redirect.conf
中,仅保留重写行:
rewrite^\/itext7\/samples\/(blob|raw)\/master\/(?!samples\/)(.*)$https://$server\u name/itext7/samples/$1/master/samples/$2永久代码>
sudo gitlab ctl重新配置
sudo gitlab ctl重启nginx
sudo/opt/gitlab/embedded/sbin/nginx-p/var/opt/gitlab/nginx-T | tail-n20
curl-Ihttps://gitlab.itextsupport.com/itext/tutorial/blob/master/signatures/src/main/java/signatures/chapter4/C4_05_SignWithBEID.java
有一件事我仍然很好奇:
行结束于rewrite
块之外server{}
行使用rewrite
变量$server\u name
变量在$server\u name
块中定义server{}
nginx-T
以奇怪的方式显示包含的语句造成的视觉混乱吗?rewrite
行是否确实在server{}
块内,即使它看起来在块外?为什么事情往往不像看上去的那样,为什么GitLab文档是用一种封闭的语言编写的?唉,这些思考可能永远没有答案
rewrite ^\/itext7\/samples\/(blob|raw)\/master\/(?!samples\/)(.*)$ https://$server_name/itext7/samples/$1/master/samples/$2 permanent;
nginx: the configuration file /var/opt/gitlab/nginx/conf/nginx.conf syntax is ok
nginx: configuration file /var/opt/gitlab/nginx/conf/nginx.conf test is successful
include /etc/nginx/conf.d/redirect.conf;
}
# configuration file /etc/nginx/conf.d/redirect.conf:
rewrite ^\/itext7\/samples\/(blob|raw)\/master\/(?!samples\/)(.*)$ https://$server_name/itext7/samples/$1/master/samples/$2 permanent;
# configuration file /var/opt/gitlab/nginx/conf/nginx-status.conf:
server {
listen 127.0.0.1:8060;
server_name localhost;
location /nginx_status {
stub_status on;
server_tokens off;
access_log off;
allow 127.0.0.1;
deny all;
}
}
HTTP/1.1 301 Moved Permanently
Server: nginx
Date: Thu, 27 Sep 2018 11:32:23 GMT
Content-Type: text/html
Content-Length: 178
Connection: keep-alive
Location: https://gitlab.itextsupport.com/itext/tutorial/blob/master/samples/signatures/src/main/java/signatures/chapter4/C4_05_SignWithBEID.java
Strict-Transport-Security: max-age=31536000