web-dev-qa-db-ja.com

nginxはブラウザのアドレスを変更せずにURLを書き換えます

リクエストのURLを変更したいのですが、ブラウザのアドレスは変更しないでください。これを達成するために、以下の構成を試しました。

location /my-website {          

    proxy_pass  http://Tomcat/my-website;
}

location =/my-website { 

        rewrite /my-website$(.*) $1/my-website/mypage/index.html last;

}

これを行うと、要求は正しいアドレスを取得しますが、ブラウザのアドレスバーも変更されます。

また試してみました。

location /my-website {                  
    proxy_pass  http://Tomcat;
    rewrite /my-website$(.*) $1/my-website/page/index.html break;

}

この構成を改善するための提案はありますか?

予想される出力

アドレスバー:protocol:// localhost/my-website

実際:protocol:// localhost/my-website/page

現在の出力

アドレスバー:protocol:// localhost/my-website/page

実際:protocol:// localhost/my-website/page

試したこと:

編集

上記の問題は、302リダイレクトで直面しています。その他の場合は、ブラウザーのアドレスを変更せずにURLを変更します。私は以下の設定を使用して後者のケースを処理しています:

location /my-website {      

        proxy_pass  http://Tomcat;
        rewrite ^(.*)my-website/src(.*)$ $1my-website/page/src$2 break;


    }

つまり、その場所の後に/ srcが続き、機能します。

302の場合、場所はmy-website /であり、上記の試みは失敗します。

My file config:

events {
    worker_connections  1024;
}


http {
    include       mime.types;
    default_type  application/octet-stream;



    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"' 
                      '"$upstream_http_location"';    

    rewrite_log  on;

    #log_format  graylog2_format  '$remote_addr - $remote_user [$time_local] "$request" $status $body_bytes_sent "$http_referer" "$http_user_agent" "$http_x_forwarded_for" <msec=$msec|connection=$connection|connection_requests=$connection_requests|millis=$request_time>';

    error_log logs/error.log warn;

    sendfile        on;

    keepalive_timeout  65;

    map $http_user_agent $ua_redirect {
    default 'abc';        
    }



    upstream docker-mysite {
        server localhost:9012;
    }


    proxy_set_header     Host $Host;
    proxy_set_header     X-Real-IP $remote_addr;
    proxy_set_header     X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header     X-Forwarded-Host $server_name;
    proxy_set_header     X-Forwarded-Proto $scheme;
    proxy_read_timeout   900;

    client_max_body_size 0; 

server {
    listen       80;      


    access_log  logs/Host.access.log  main; 

    #below config works
    location /mysite {                      
        proxy_pass  http://docker-mysite;
        rewrite ^(.*)mysite/src(.*)$ $1mysite/$ua_redirect/src$2 break;

    }
    #below config works but modifies the browser url hence the issue
    location = /mysite {    
        proxy_pass  http://docker-mysite;               
        rewrite /mysite(.*)$ /mysite/$ua_redirect$1 break;

    }

}

}

ログ

127.0.0.1 - - [03/Sep/2018:11:46:07 +0500] "GET /mysite/login?code=token HTTP/1.1" 302 0 "http://localhost/loginapp/web/index.html" "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36" "-"http://localhost/mysite/abc
127.0.0.1 - - [03/Sep/2018:11:46:07 +0500] "GET /mysite/abc HTTP/1.1" 404 0 "http://localhost/loginapp/web/index.html" "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36" "-"-
3

通常のスキーマで正しく機能するため、書き換えロジックは問題ありません。 rewriteディレクティブはリクエストの応答ではなくリクエストURIを変更するだけなので、302リダイレクトのブラウザーURLは変更されます。

典型的な302応答は次のようになります。

HTTP/1.1 302 Found
Location: http://overrideurlrewriting.com

302応答のLocationヘッダーにより、ブラウザは指定されたURLをたどります。

可能な解決策は、proxy_redirectディレクティブを使用して、プロキシされた応答(302リダイレクトの場合)からLocationヘッダーを変更することです

役立つリンク:

https://stackoverflow.com/a/26025618/207392

http://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_redirect

1
Abdul Rauf

これを試して:

location /my-website {                  
    proxy_pass  http://Tomcat;
    rewrite /my-website(.*)$ $1/my-website/page/index.html break;
}

正規表現の$が正しくありません-正規表現の末尾にあるはずです。あなたの意図を正確に伝えることはできませんが、index.html以外のページが機能するように、書き換えターゲットを変更することもできます。

location /my-website {
    proxy_pass  http://Tomcat:8000;
    rewrite /my-website(.*)$ /my-website/page$1 break;
}
0
dwurf