nginx schreibt die URL neu, ohne die Browseradresse zu ändern

nginx schreibt die URL neu, ohne die Browseradresse zu ändern

Ich möchte die URL einer Anfrage ändern, die Browseradresse soll sich aber nicht ändern. Um dies zu erreichen, habe ich die folgende Konfiguration ausprobiert:

location /my-website {          

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

location =/my-website { 

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

}

Dadurch erhält die Anfrage zwar die richtige Adresse, allerdings ändert sich auch die Adressleiste des Browsers.

Auch versucht;

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

}

Irgendwelche Vorschläge zur Verbesserung dieser Konfiguration?

Erwartete Ausgabe

Adressleiste:Protokoll://localhost/meine-Website

tatsächlich:Protokoll://localhost/meine-Website/Seite

Aktueller Output

Adressleiste:Protokoll://localhost/meine-Website/Seite

tatsächlich:Protokoll://localhost/meine-Website/Seite

Versuchte Dinge:

Bearbeiten

Das obige Problem tritt bei einer 302-Umleitung auf. In anderen Fällen wird die URL geändert, ohne die Browseradresse zu ändern. Ich behandle den letzteren Fall mit der folgenden Konfiguration:

location /my-website {      

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


    }

d. h. auf diesen Speicherort folgt /src, und es funktioniert.

Im Fall 302 ist der Speicherort einfach meine-Website/ und die oben versuchten Dinge schlagen fehl.

Meine Dateikonfiguration:

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;

    }

}

}

Protokolle

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" "-"-

Antwort1

Ihre Umschreiblogik ist in Ordnung, da sie im normalen Schenerio korrekt funktioniert. Die Browser-URL ändert sich für die 302-Umleitung, da rewritedie Direktive nur die Anforderungs-URI ändert, nicht die Antwort auf die Anforderung.

Eine typische 302-Antwort sieht folgendermaßen aus:

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

LocationHeader in der 302-Antwort zwingt den Browser, der angegebenen URL zu folgen.

LocationEine mögliche Lösung besteht darin , den Header der geproxten Antwort (im Falle einer 302-Umleitung) mithilfe der proxy_redirectDirektive zu ändern

Hilfreiche Links:

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

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

Antwort2

Versuche dies:

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

Ich denke, $in Ihrem regulären Ausdruck ist ein Fehler aufgetreten – er sollte am Ende des regulären Ausdrucks stehen. Ich kann nicht genau sagen, was Sie beabsichtigen, aber Sie möchten vielleicht auch Ihr Umschreibziel ändern, damit andere Seiten als diese index.htmlfunktionieren:

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

verwandte Informationen