nginx proxy_pass応答ヘッダーの場所の書き換え


11

このnginxインスタンスの目的は、GitLabとOpenWRT Luciにリバースプロキシを介してリダイレクトさせることです。それはすでに他のいくつかのウェブサイトで機能しており、すべてがこの問題に対抗するように見えるベースURLを持っています。

  • この例のGitLabは、ローカルサーバーのポート9000にあります。
  • nginxウェブサイトはポート8080にあります。
  • OpenWRTにもまったく同じ問題がありますが、/ cgi-bin / luci /

サンプルの場所に関連するnginx設定は次のとおりです。

location /gitlab/ {
    proxy_pass http://127.0.0.1:9000/;
    proxy_redirect default;
}
  • 結果は末尾のスラッシュを付けても付けなくても同じです。

この場所に適用されているいくつかのヘッダープロキシ構成オプションがあります。

# Timeout if the real server is dead
proxy_next_upstream error timeout invalid_header http_500 http_502 http_503;

# Basic Proxy Config
proxy_set_header    Host $host:$server_port;
proxy_set_header    Origin $scheme://$host:$server_port;    
proxy_set_header    Connection $http_connection;
proxy_set_header    Cookie $http_cookie;
proxy_set_header    Upgrade $http_upgrade;
proxy_set_header    X-Forwarded-Protocol $scheme;
proxy_set_header    X-Scheme $scheme;
proxy_set_header    X-Real-IP $remote_addr;
proxy_set_header    X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header    X-Forwarded-Ssl on;
proxy_set_header    X-Frame-Options SAMEORIGIN;

# Advanced Proxy Config
send_timeout            5m;
proxy_read_timeout      300;
proxy_send_timeout      300;
proxy_connect_timeout   300;

proxy_buffers 32 4k;
proxy_buffer_size           4k;
proxy_busy_buffers_size     64k;
proxy_temp_file_write_size  64k;

proxy_http_version 1.1;
proxy_cache_bypass $cookie_session;
proxy_no_cache $cookie_session;]
  • #proxy_set_header Hostをコメントアウトすると、代わりにブラウザが https://127.0.0.1:9000/users/sign_in

をブラウズするとhttps://website.com:8080/gitlab/

GET /gitlab/ HTTP/1.1
Host: website.com:8080

応答が誤っての/users/sign_in代わりに戻る/gitlab/users/sign_in

HTTP/1.1 302 Found
Cache-Control: no-cache
Connection: keep-alive
Content-Type: text/html; charset=utf-8
Location: https://website.com:8080/users/sign_in

手動でhttps:// website:8080 / gitlab / users / sign_inにアクセスするとページが読み込まれますが、上記と同じ問題が発生するまで、アセットは表示されません。

GitLabアセットの失敗

nginx docsを読んで、それは失敗したようですが、デフォルトのプロキシ動作がこのシナリオを処理するべきであることを示唆しています。

ログはあまり表示されていないようです。

これがなぜ起こっているのかを診断するのに役立つ追加の手順は何ですか?

回答:


3

proxy_passターゲットに末尾のスラッシュを追加します。

更新: OPは、仮想ホストが受け入れていたものを正確に指定しませんでしたhttps。スキームが追加のヘッダーでバックエンドサーバーに転送されると、httpsではなく上流の返信のヘッダーを書き換えるときにデフォルトでproxy_redirect default; nginxがhttpスキームを期待するように命令されるため、問題が発生しLocationます。

したがって、これを明示的により一般的な形式に変更する必要がありました(末尾のスラッシュはまだ必要です)。

location /gitlab/ {
    proxy_pass http://127.0.0.1:9000/;
    proxy_redirect $scheme://$host:$server_port/ /gitlab/;
}

こんにちはザビエル、返信ありがとうございます。運がありません。これは私が試したものの1つです(proxy_passのドキュメントと一致します)が、変更はありません:(
Jake Edwards

別のconfにあったproxy_set_headerに関する情報を追加しました。ホスト行を削除すると状況が変わります-127.0.0.1:9000/users/sign_inに
Jake Edwards

OK、問題は httpを期待schemeするproxy_redirect default動作を伴う(https)です。Hostヘッダーをコメントアウトする前の構成にして、proxy_redirectコンテンツをに変更し$scheme://$host:$server_port/ /gitlab/;ます。テスト時には、ブラウザのキャッシュされたヘッダーにアクセスしていないことを確認してください(CLIツールまたはプライベートナビゲーションを使用)。
ザビエルルーカス

いいですね、それで正しいURLに移動します(少なくともGitLabはそうですが、OpenWRTは引き続き/ cgi-bin / luciに行きます-一度に1つずつです)。ただし、asset / images / etcはありません-:8080 / gitlab / assets / application-5ec1aeb4604cbfbeff836f956308b0ed.jsの代わりに:8080 / assets / application-5ec1aeb4604cbfbeff836f956308b0ed.js
ジェイクエドワーズ

1
@ShadowXVII Assetsリンクはアプリケーションによって生成されます。そこで変更する必要があります。Nginxは、ページコンテンツではなく、アプリによって発行されたリダイレクトのみを書き換えます。
ザビエルルーカス

0

@XavierLucasが言っていることは正しいです。gitlabのドキュメントには、見出し「Install GitLab under a relative URL」の下にガイドがあります。最近、gitlabとnginxがインストールされたArch Linuxサーバーをセットアップしているときにこの問題に遭遇しました。これにより、すべてのアセットを再コンパイルして正しい相対パスを持つようにして問題を解決しました。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.