Я установил gitlab на своем личном сервере и использовал этот ответ и этот ответ (вместе с некоторыми данными от этот чтобы он работал с моей установкой apache. Все работает нормально, когда я захожу на gitlab.example.com, я вижу пользовательский интерфейс gitlab, могу создавать учетные записи и так далее. Однако, когда я проверил 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? Как я могу это обойти?
Примечание: Я абсолютно не уверен, какой модуль вызывает поведение пересылки, если вам нужны другие файлы конфигурации, просто дайте мне знать.
Вы можете попробовать добавить косую черту в конце / к ProxyPass целевой URL, т.е. изменить
ProxyPassReverse http://127.0.0.1:8080
в
ProxyPassReverse http://127.0.0.1:8080/
поскольку вы применяете эти директивы к пути, который также заканчивается косой чертой / (или только косую черту в этом случае: <Location />
) как предупреждает руководство:
Если первый аргумент заканчивается замыкающим /, второй аргумент также должен заканчиваться замыкающим /, и наоборот. В противном случае результирующие запросы к бэкэнду могут пропустить некоторые необходимые косые черты и не доставить ожидаемых результатов.