Thin アプリサーバーを使用しようとしていて、1つの問題がありました。
Nginx プロキシproxy_pass http://my_app_upstream;
を使用したThin(またはUnicorn)へのリクエストの場合、アプリケーションはnginx(http://my_app_upstream
)によって送信された変更済みURLを受信します。
私が欲しいのは、アプリが大きく依存しているため、元のURLとクライアントからの元のリクエストを変更せずに渡すことです。
Nginx ' doc 言います:
未処理の形式でURIを送信する必要がある場合は、URI部分なしでproxy_passディレクティブを使用する必要があります。
しかし、関連するサンプルが実際にURIを使用しているため、それをどのように構成するか正確にはわかりません。
location /some/path/ {
proxy_pass http://127.0.0.1;
}
クライアントから元のリクエストURLを保持するの方法を見つけてください。
私は思います - proxy_set_header
ディレクティブが役立ちます:
location / {
proxy_pass http://my_app_upstream;
proxy_set_header Host $Host;
# ...
}
私の場合、proxy_set_header Host $ Hostミスポートだけです。によって解決されました:
location / {
proxy_pass http://BACKENDIP/;
include /etc/nginx/proxy.conf;
}
そして、proxy.confで
proxy_redirect off;
proxy_set_header Host $Host:$server_port;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
リクエストのabsoluteURI
とヘッダーのHost
をチョッピングせずに完全に転送するには:
server {
listen 35005;
location / {
rewrite ^(.*)$ "://$http_Host$uri$is_args$args";
rewrite ^(.*)$ "http$uri$is_args$args" break;
proxy_set_header Host $Host;
proxy_pass https://deploy.org.local:35005;
}
}
ここにあります: https://opensysnotes.wordpress.com/2016/11/17/nginx-proxy_pass-with-absolute-url/
nginxは、ポートを渡す$ http_Host変数も提供します。ホストとポートの連結。
だからあなたはただする必要があります:
proxy_set_header Host $http_Host;
提供しようとしている場所が何かによって変更された場合try_files
、これはバックエンドのリクエストを保持します:
location / {
proxy_pass http://127.0.0.1:8080$request_uri;
}
私のシナリオでは、nginx vhost構成のコードの下にこれを作成しました
server {
server_name dashboards.etilize.com;
location / {
proxy_pass http://demo.etilize.com/dashboards/;
proxy_set_header Host $http_Host;
}}
$ http_Hostは、要求されたものと同じヘッダーにURLを設定します
これを見つける他の人々への注意:nginxがURLを操作しないようにする解決策の中心は、Copy:proxy_passディレクティブの最後にあるスラッシュを削除することです。 http:// my_app_upstream vs http:// my_app_upstream / –ヒューゴ・ジョセフソン
私はこれをコメントで見つけましたが、本当に答えになるはずです。