Puncte:1

Nginx redirecționează către un domeniu diferit bazat pe subdirector

drapel br

Nu sunt expert în nginx, dar îl folosesc de ceva vreme. Deservesc mai multe servere de aplicații web prin nginx ca proxy invers.

Problema: Servim într-un subdirector o aplicație Spring Boot, nginx redirecționează utilizatorul către un domeniu total diferit (nume_server) atunci când vizitează direct subdirectorul. Să presupunem că subdirectorul este „/subdir”, de asemenea, servesc o aplicație wordpress în rădăcină, să spunem că este „https://example.com”.

  1. Dacă, de exemplu, un utilizator introduce „https://example.com/subdir/countries” va trimite corect la aplicația Spring Boot și va prelua lista de țări.
  2. Dar dacă utilizatorul introduce „https://example.com/subdir” va afișa o altă aplicație diferită care se află într-un alt nume de domeniu (să spunem că este https://another_example.com). Dar URL-ul rămâne același, utilizatorul rămâne în „https://example.com/subdir”, dar aplicația este una diferită și va vedea index.html-ul acelei aplicații.

Configurația nginx pentru aplicația wordpress și Spring Boot este următoarea:

Server {
        asculta 80;
        server_name example.com www.example.com;
        returnează 301 https://example.com$request_uri;
}

Server {
        asculta 443 ssl;

    server_name example.com www.example.com;

    root /root/wordpress_example;
    index index.php;

    ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem; # gestionat de Certbot
    ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem; # gestionat de Certbot

    includ /etc/letsencrypt/options-ssl-nginx.conf; # gestionat de Certbot
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # gestionat de Certbot

    locație = /favicon.ico { log_not_found off; access_log off; }
    locație = /robots.txt { log_not_found off; access_log off; permite tuturor; }
    locație ~* \.(css|gif|ico|jpeg|jpg|js|png)$ {
            expira max;
            log_not_found off;
    }

    Locație / {
            try_files $uri $uri/ /index.php?$args;
    }

    locație ~ \.php$ {
            include fastcgi_params;
            fastcgi_intercept_errors activat;
            fastcgi_pass unix:/var/run/php/php8.0-fpm.sock;
            fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    }

    locație /subdir/ {
            proxy_pass http://127.0.0.1:8080/;
            proxy_redirect dezactivat;
            dimensiunea_buffer_proxy 128k;
            proxy_buffers 4 256k;
            proxy_busy_buffers_size 256k;
    }
}

Și configurația nginx pentru aplicația în care utilizatorul este redirecționat este:

Server {
        asculta 80;
        nume_server another_example.com www.nother_example.com;
        returnează 301 https://another_example.com$request_uri;
}

Server {
    underscores_in_headers activate;
        asculta 443 ssl;

        nume_server another_example.com www.nother_example.com;

        ssl_certificate /etc/letsencrypt/live/another_example.com/fullchain.pem; # gestionat de Certbot
        ssl_certificate_key /etc/letsencrypt/live/another_example.com/privkey.pem; # gestionat de Certbot

        includ /etc/letsencrypt/options-ssl-nginx.conf; # gestionat de Certbot
        ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # gestionat de Certbot

    pagina de eroare 404 /404.html;
    locație = /404.html {
        root /root/public/;
        intern;
    }

        Locație / {
                root /root/public/;
                index index.html;
        }

    locație ~* ^/(?:favicon|apple-touch-icon|android-chrome-|mstile-|safari-pinned-tab.svg|browserconfig.xml|mainfest.json) {
        alias /root/public/icons/icon-48x48.png;
    }

    locație ^~ /imagini {
        alias /root/alimentacion;
        try_files $uri $uri/ =404;
    }

    locație/clasament {
                proxy_pass http://ranking;
        proxy_http_versiunea 1.1;
        proxy_set_header Actualizare $http_upgrade;
        proxy_set_header Conexiune „upgrade”;
                proxy_set_header Gazdă $gazdă;
        proxy_set_header X-Forwarded-Proto $schema;
            proxy_set_header X-Forwarded-Port $server_port;
                dimensiunea_buffer_proxy 128k;
                proxy_buffers 4 256k;
                proxy_busy_buffers_size 256k;
        }
}

De ce redirecționarea utilizatorului către another_example.com când accesează direct calea „/subdir”?

Aplicația Spring Boot nu are nimic în rădăcină, în local când solicitați rădăcina aplicației Spring Boot returnează 404, ar putea fi aceasta problema?

EDITați ieșirea nginx -T:

nginx: sintaxa fișierului de configurare /etc/nginx/nginx.conf este ok
nginx: fișierul de configurare /etc/nginx/nginx.conf testul a reușit
# fișier de configurare /etc/nginx/nginx.conf:
utilizator root;
worker_proceses auto;
pid /run/nginx.pid;
includ /etc/nginx/modules-enabled/*.conf;

evenimente {
    conexiuni_muncitor 768;
    # multi_accept on;
}

http {

    ##
    # Setări de bază
    ##

    sendfile activat;
    tcp_nopush activat;
    tcp_nodelay activat;
    keepalive_timeout 65;
    types_hash_max_size 2048;
    server_tokens dezactivat;
    client_max_body_size 180M; #Â permite clientului să încarce fișiere de 180 MB

    # server_names_hash_bucket_size 64;
    # server_name_in_redirect off;

    includ /etc/nginx/mime.types;
    aplicație de tip_default/octet-stream;

    ##
    # Setări SSL
    ##

    ssl_protocols TLSv1 TLSv1.1 TLSv1.2; # Eliminarea SSLv3, ref: POODLE
    ssl_prefer_server_ciphers activat;

    ##
    # Setări de înregistrare
    ##

    access_log /var/log/nginx/access.log;
    error_log /var/log/nginx/error.log;

    ##
    # Setări Gzip
    ##

    gzip on;

    gzip_vary on;
    gzip_proxied orice;
    gzip_comp_level 6;
    gzip_buffers 16 8k;
    gzip_http_versiunea 1.1;
    gzip_types text/text simplu/aplicație css/aplicație json/text javascript/aplicație xml/aplicație xml/xml+text rss/javascript;

    ##
    # Echilibrul de încărcare
    ##
    în amonte uv {
        server localhost:8081;
    }

    test în amonte {
        server localhost:8087;
    }

    backend în amonte {
        server localhost:8085;
    }

    clasament în amonte {
        server localhost:4000;
    }

    ##
    # Configurații gazdă virtuală
    ##

    includ /etc/nginx/conf.d/*.conf;
    includ /etc/nginx/sites-enabled/*;
}

# fișier de configurare /etc/nginx/modules-enabled/50-mod-http-geoip.conf:
load_module modules/ngx_http_geoip_module.so;

# fișier de configurare /etc/nginx/modules-enabled/50-mod-http-image-filter.conf:
load_module modules/ngx_http_image_filter_module.so;

# fișier de configurare /etc/nginx/modules-enabled/50-mod-http-xslt-filter.conf:
load_module modules/ngx_http_xslt_filter_module.so;

# fișier de configurare /etc/nginx/modules-enabled/50-mod-mail.conf:
load_module modules/ngx_mail_module.so;

# fișier de configurare /etc/nginx/modules-enabled/50-mod-stream.conf:
load_module modules/ngx_stream_module.so;

# fișier de configurare /etc/nginx/mime.types:

tipuri {
    text/html html htm shtml;
    text/css css;
    text/xml xml;
    imagine/gif gif;
    imagine/jpeg jpeg jpg;
    aplicație/javascript js;
    aplicație/atom+xml atom;
    aplicație/rss+xml rss;

    text/mathml mml;
    text/txt simplu;
    text/vnd.sun.j2me.app-descriptor jad;
    text/vnd.wap.wml wml;
    text/x-component htc;

    imagine/png png;
    imagine/tiff tif tiff;
    imagine/vnd.wap.wbmp wbmp;
    imagine/x-icoană ico;
    imagine/x-jng jng;
    imagine/x-ms-bmp bmp;
    imagine/svg+xml svg svgz;
    imagine/webp webp;

    aplicație/font-woff woff;
    aplicație/java-arhivă jar war ear;
    aplicație/json json;
    aplicație/mac-binhex40 hqx;
    aplicație/msword doc;
    cerere/pdf pdf;
    aplicație/postscript ps eps ai;
    aplicație/rtf rtf;
    application/vnd.apple.mpegurl m3u8;
    application/vnd.ms-excel xls;
    application/vnd.ms-fontobject eot;
    application/vnd.ms-powerpoint ppt;
    application/vnd.wap.wmlc wmlc;
    application/vnd.google-earth.kml+xml kml;
    application/vnd.google-earth.kmz kmz;
    aplicație/x-7z-comprimat 7z;
    aplicare/x-cacao cco;
    application/x-java-archive-diff jardiff;
    aplicație/x-java-jnlp-fișier jnlp;
    aplicație/x-makeself rulează;
    application/x-perl pl pm;
    application/x-pilot prc pdb;
    application/x-rar-compressed rar;
    application/x-redhat-package-manager rpm;
    aplicare/x-mare mare;
    aplicație/x-shockwave-flash swf;
    application/x-stuffit sit;
    aplicație/x-tcl tcl tk;
    application/x-x509-ca-cert der pem crt;
    aplicație/x-xpinstall xpi;
    aplicație/xhtml+xml xhtml;
    aplicație/xspf+xml xspf;
    aplicare/zip zip;

    aplicație/octet-stream bin exe dll;
    application/octet-stream deb;
    application/octet-stream dmg;
    application/octet-stream iso img;
    aplicație/octet-stream msi msp msm;

    application/vnd.openxmlformats-officedocument.wordprocessingml.document docx;
    application/vnd.openxmlformats-officedocument.spreadsheetml.sheet xlsx;
    application/vnd.openxmlformats-officedocument.presentationml.presentation pptx;

    audio/midi mid midi kar;
    audio/mpeg mp3;
    audio/ogg ogg;
    audio/x-m4a m4a;
    audio/x-realaudio ra;

    video/3gpp 3gpp 3gp;
    video/mp2t ts;
    video/mp4 mp4;
    video/mpeg mpeg mpg;
    video/quicktime mov;
    video/webm webm;
    video/x-flv flv;
    video/x-m4v m4v;
    video/x-mng mng;
    video/x-ms-asf asx asf;
    video/x-ms-wmv wmv;
    video/x-msvideo avi;
}

# fișier de configurare /etc/letsencrypt/options-ssl-nginx.conf:
# Acest fișier conține parametri importanți de securitate. Dacă modificați acest fișier
# manual, Certbot nu va putea oferi automat securitate viitoare
# actualizări. În schimb, Certbot va imprima și va înregistra un mesaj de eroare cu o cale către
# fișierul actualizat la care va trebui să vă referiți atunci când actualizați manual
# acest fișier.

ssl_session_cache shared:le_nginx_SSL:1m;
ssl_session_timeout 1440m;

ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_prefer_server_ciphers activat;

ssl_ciphers „ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256-SHA256-ECDSA-CEDHE256-ECDSA-CED3-ECDHE-ECDSA-AES128-GCM-SHA256 RSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHAES-SHA256:ECDHE-ECDSA-SHA256: SHA:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA:ECDHE-RSA-AES256-SHA:DHE-RSA256:-SHA DHE-RSA-AES128-SHA:DHE-RSA-AES256-SHA256:DHE-RSA-AES256-SHA:ECDHE-ECDSA-DES-CBC3-SHA:ECDHE-RSA-DES-CBC3-SHA:EDH-RSA-DES- CBC3-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:DES-CBC3-SHA:!DSS";

# fișier de configurare /etc/nginx/sites-enabled/example:
Server {
        asculta 80;
        nume_server example.com www.example.com;
        returnează 301 https://example.com$request_uri;
}

Server {
        asculta 443 ssl;

        nume_server example.com www.example.com;

        root /root/wordpress_example;
        index index.php;

        ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem; # gestionat de Certbot
        ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem; # gestionat de Certbot

        includ /etc/letsencrypt/options-ssl-nginx.conf; # gestionat de Certbot
        ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # gestionat de Certbot

        locație = /favicon.ico { log_not_found off; access_log off; }
        locație = /robots.txt { log_not_found off; access_log off; permite tuturor; }
        locație ~* \.(css|gif|ico|jpeg|jpg|js|png)$ {
                expira max;
                log_not_found off;
        }

        Locație / {
                try_files $uri $uri/ /index.php?$args;
        }

        locație ~ \.php$ {
                include fastcgi_params;
                fastcgi_intercept_errors activat;
                fastcgi_pass unix:/var/run/php/php8.0-fpm.sock;
                fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        }

        locație /subdir/ {
                proxy_pass http://127.0.0.1:8080/;
                proxy_redirect dezactivat;
                dimensiunea_buffer_proxy 128k;
                proxy_buffers 4 256k;
                proxy_busy_buffers_size 256k;
        }

        locație = /subdir {
                proxy_pass http://127.0.0.1:8080/;
                proxy_redirect dezactivat;
                dimensiunea_buffer_proxy 128k;
                proxy_buffers 4 256k;
                proxy_busy_buffers_size 256k;
        }
}

# fișier de configurare /etc/nginx/fastcgi_params:

fastcgi_param QUERY_STRING $șir_interogare;
fastcgi_param REQUEST_METHOD $cerere_method;
fastcgi_param CONTENT_TYPE $content_type;
fastcgi_param CONTENT_LENGTH $content_length;

fastcgi_param SCRIPT_NAME $fastcgi_script_name;
fastcgi_param REQUEST_URI $request_uri;
fastcgi_param DOCUMENT_URI $document_uri;
fastcgi_param DOCUMENT_ROOT $document_root;
fastcgi_param SERVER_PROTOCOL $server_protocol;
fastcgi_param REQUEST_SCHEME $schemă;
fastcgi_param HTTPS $https dacă_nu_vide;

fastcgi_param GATEWAY_INTERFACE CGI/1.1;
fastcgi_param SERVER_SOFTWARE nginx/$nginx_version;

fastcgi_param REMOTE_ADDR $adresă_la distanță;
fastcgi_param REMOTE_PORT $port_la distanță;
fastcgi_param SERVER_ADDR $adresa_server;
fastcgi_param SERVER_PORT $server_port;
fastcgi_param SERVER_NAME $server_name;

# Numai PHP, necesar dacă PHP a fost construit cu --enable-force-cgi-redirect
fastcgi_param REDIRECT_STATUS 200;

# fișier de configurare /etc/nginx/sites-enabled/another_example:
Server {
        asculta 80;
        nume_server another_example.com www.nother_example.com;
        returnează 301 https://another_example.com$request_uri;
}

Server {
    underscores_in_headers activate;
        asculta 443 ssl;

        nume_server another_example.com www.nother_example.com;

        ssl_certificate /etc/letsencrypt/live/another_example.com/fullchain.pem; # gestionat de Certbot
        ssl_certificate_key /etc/letsencrypt/live/another_example.com/privkey.pem; # gestionat de Certbot

        includ /etc/letsencrypt/options-ssl-nginx.conf; # gestionat de Certbot
        ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # gestionat de Certbot

    pagina de eroare 404 /404.html;
    locație = /404.html {
        root /root/public/;
        intern;
    }

        Locație / {
                root /root/public/;
                index index.html;
        }

    locație ~* ^/(?:favicon|apple-touch-icon|android-chrome-|mstile-|safari-pinned-tab.svg|browserconfig.xml|mainfest.json) {
        alias /root/public/icons/icon-48x48.png;
    }

    locație ^~ /imagini {
        alias /root/alimentacion;
        try_files $uri $uri/ =404;
    }

    locație/clasament {
                proxy_pass http://ranking;
        proxy_http_versiunea 1.1;
        proxy_set_header Actualizare $http_upgrade;
        proxy_set_header Conexiune „upgrade”;
                proxy_set_header Gazdă $gazdă;
        proxy_set_header X-Forwarded-Proto $schema;
            proxy_set_header X-Forwarded-Port $server_port;
                dimensiunea_buffer_proxy 128k;
                proxy_buffers 4 256k;
                proxy_busy_buffers_size 256k;
        }
}

EDITARE CU SOLUȚIA:

Cu ajutorul lui @Tero Kilkanen și încercări și erori, am găsit soluția:

    locație /subdir/ {
            proxy_pass http://127.0.0.1:8080/;
            proxy_redirect dezactivat;
    }

    locație = /subdir {
            proxy_pass http://127.0.0.1:8080;
            proxy_redirect dezactivat;
    }

    locație = /subdir/ {
            proxy_pass http://127.0.0.1:8080;
            proxy_redirect dezactivat;
    }
Puncte:2
drapel us

locație /subdir/ potrivește cererile în care este URI /subdir/.

În cererea dvs. exemplu, URI este /subdir. Prin urmare că Locație bloc nu este folosit.

Solicitarea este apoi procesată de Locație /, iar apoi index.php din aplicația respectivă face ceva.

A face /subdir pentru a merge în aceeași locație, trebuie să adăugați altul Locație bloc:

locație = /subdir {
        proxy_pass http://127.0.0.1:8080/;
        proxy_redirect dezactivat;
        dimensiunea_buffer_proxy 128k;
        proxy_buffers 4 256k;
        proxy_busy_buffers_size 256k;
}

The = attribute face ca aceasta să fie o potrivire exactă și este procesată mai întâi de nginx.

Nico avatar
drapel br
Am încercat acest lucru, dar nu funcționează, când vizitez https://example.com/subdir, adaugă automat un „/” la sfârșit. Nu stiu de ce
drapel us
Ați încercat cu un browser pe care l-ați folosit mai devreme pentru a testa? Dacă da, atunci browserul ar fi putut stoca în cache redirecționarea 301 pe care nginx o trimite atunci când găsește un director cu același nume ca și URI-ul. Vă rugăm să testați cu `curl -v`.
Nico avatar
drapel br
Am testat cu `curl -v` și încă se întâmplă, returnează conținutul index.html al domeniului „other_example.com” în loc să fac proxy către `http://127.0.0.1:8080/`
drapel us
Și ați repornit corect nginx?
Nico avatar
drapel br
da am, am reincarcat mai intai si acum cand ai intrebat am repornit si acelasi lucru, dar acum (cu browser-ul incognito) nu se adauga '/' aditional la final dar tot returneaza index.html-ul celeilalte configuratii și, de asemenea, cu `curl -v`
drapel us
Vă rugăm să adăugați rezultatul `nginx -T` la întrebarea inițială.
Nico avatar
drapel br
Gata, am editat întrebarea originală cu rezultatul comenzii `nginx -T`
Nico avatar
drapel br
Ok, am remediat problema prin eliminarea reacției din trecerea proxy: `proxy_pass http://127.0.0.1:8080/;` la `proxy_pass http://127.0.0.1:8080;` în acest fel nu sunt redirecționat către celălalt server web, dar dacă în browser pun adresa URL cu „/subdir/” sunt redirecționat către altă aplicație

Postează un răspuns

Majoritatea oamenilor nu înțeleg că a pune multe întrebări deblochează învățarea și îmbunătățește legătura interpersonală. În studiile lui Alison, de exemplu, deși oamenii își puteau aminti cu exactitate câte întrebări au fost puse în conversațiile lor, ei nu au intuit legătura dintre întrebări și apreciere. În patru studii, în care participanții au fost implicați în conversații ei înșiși sau au citit transcrieri ale conversațiilor altora, oamenii au avut tendința să nu realizeze că întrebarea ar influența – sau ar fi influențat – nivelul de prietenie dintre conversatori.