我在我的个人服务器上设置了 gitlab,并使用这个答案和这个答案(以及来自这使其与我的 Apache 安装兼容。一切正常,当我访问 gitlab.example.com 时,我可以看到 gitlab UI,可以创建帐户等等。但是,当我检查我转发到的 URI 时,它
https://gitlab.example.com//users/sign_in
(请注意域名后面的两个斜杠)。这其实不是问题,但我想知道为什么会出现这种情况以及如何修复它 - 尤其是当我从地址中删除其中一个斜杠时,它仍然正常工作。(所以https://gitlab.example.com/users/sign_in
完全一样)。
事实上,我被转发了两次:
GET https://gitlab.example.com
=>301 Moved Permanently
与Location:https://gitlab.example.com/
GET https://gitlab.example.com/
=>302 Found
与Location:https://gitlab.example.com//users/sign_in
这是我的 apache 配置文件(`/etc/apache2/sites-enabled/gitlab.conf):
<IfModule mod_ssl.c>
<VirtualHost *:443>
ServerName gitlab.example.com
ServerSignature Off
ProxyPreserveHost On
ProxyPassMatch ^(/[^/]+\.(html|png|ico|css|txt))$ !
ProxyPass /assets !
<Location />
Order deny,allow
Allow from all
ProxyPassReverse http://127.0.0.1:8080
ProxyPassReverse http://gitlab.example.com
</Location>
RewriteEngine on
RewriteCond %{DOCUMENT_ROOT}/%(REQUEST_FILENAME} !-f
RewriteRule .* http://127.0.0.1:8080%{REQUEST_URI} [P,QSA]
DocumentRoot /opt/gitlab/embedded/service/gitlab-rails/public
SSLCertificateFile /etc/letsencrypt/live/example.com/fullchain.pem
SSLCertificateKeyFile /etc/letsencrypt/live/example.com/privkey.pem
Include /etc/letsencrypt/options-ssl-apache.conf
</VirtualHost>
</IfModule>
这是 gitlab 的问题吗?我该如何解决?
笔记:我完全不确定哪个模块导致了转发行为,如果您需要任何其他配置文件,请告诉我。
答案1
你可能想尝试/在代理通行证目标 URL 即更改
ProxyPassReverse http://127.0.0.1:8080
进入
ProxyPassReverse http://127.0.0.1:8080/
因为您将这些指令应用于也以尾部斜杠/(或在本例中仅以斜杠<Location />
:)结尾的路径,正如手册警告的那样:
如果第一个参数以尾随 / 结尾,则第二个参数也应以尾随 / 结尾,反之亦然。否则,对后端的最终请求可能会遗漏一些必要的斜杠,并且无法提供预期的结果。