Điểm:1

Nginx chuyển hướng đến tên miền khác nhau dựa trên thư mục con

lá cờ br

Tôi không phải là chuyên gia về nginx nhưng tôi đã sử dụng nó được một thời gian. Tôi đang phục vụ nhiều máy chủ ứng dụng web thông qua nginx dưới dạng proxy ngược.

Vấn đề: Tôi đang phục vụ trong thư mục con một ứng dụng Spring Boot, nginx đang chuyển hướng người dùng đến một miền hoàn toàn khác (server_name) khi truy cập trực tiếp vào thư mục con. Giả sử thư mục con là "/subdir", tôi cũng đang phục vụ một ứng dụng wordpress trong thư mục gốc, giả sử là "https://example.com".

  1. Ví dụ: nếu người dùng nhập "https://example.com/subdir/countries", nó sẽ ủy quyền chính xác cho ứng dụng Spring Boot và nó sẽ truy xuất danh sách quốc gia.
  2. Nhưng nếu người dùng nhập "https://example.com/subdir", nó sẽ hiển thị một ứng dụng khác nằm trong một tên miền khác (giả sử là https://another_example.com). Nhưng URL vẫn như cũ, người dùng vẫn ở "https://example.com/subdir" nhưng ứng dụng là một ứng dụng khác và nó sẽ thấy index.html của ứng dụng đó.

Cấu hình nginx cho ứng dụng wordpress và Spring Boot như sau:

người phục vụ {
        nghe 80;
        server_name example.com www.example.com;
        trả lại 301 https://example.com$request_uri;
}

người phục vụ {
        nghe 443 ssl;

    server_name example.com www.example.com;

    gốc /root/wordpress_example;
    chỉ số index.php;

    ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem; # được quản lý bởi Certbot
    ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem; # được quản lý bởi Certbot

    bao gồm /etc/letsencrypt/options-ssl-nginx.conf; # được quản lý bởi Certbot
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # được quản lý bởi Certbot

    vị trí = /favicon.ico { log_not_found tắt; truy cập_đăng xuất; }
    vị trí = /robots.txt { log_not_found tắt; truy cập_đăng xuất; chấp nhận tất cả; }
    vị trí ~* \.(css|gif|ico|jpeg|jpg|js|png)$ {
            hết hạn tối đa;
            log_not_found tắt;
    }

    địa điểm / {
            try_files $uri $uri/ /index.php?$args;
    }

    vị trí ~ \.php$ {
            bao gồm fastcgi_params;
            bật fastcgi_intercept_errors;
            fastcgi_pass unix:/var/run/php/php8.0-fpm.sock;
            fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    }

    vị trí /thư mục con/ {
            proxy_pass http://127.0.0.1:8080/;
            proxy_redirect tắt;
            proxy_buffer_size 128k;
            proxy_buffers 4 256k;
            proxy_busy_buffers_size 256k;
    }
}

Và cấu hình nginx cho ứng dụng mà người dùng được chuyển hướng là:

người phục vụ {
        nghe 80;
        server_name another_example.com www.another_example.com;
        trả lại 301 https://another_example.com$request_uri;
}

người phục vụ {
    underscores_in_headers bật;
        nghe 443 ssl;

        server_name another_example.com www.another_example.com;

        ssl_certificate /etc/letsencrypt/live/another_example.com/fullchain.pem; # được quản lý bởi Certbot
        ssl_certificate_key /etc/letsencrypt/live/another_example.com/privkey.pem; # được quản lý bởi Certbot

        bao gồm /etc/letsencrypt/options-ssl-nginx.conf; # được quản lý bởi Certbot
        ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # được quản lý bởi Certbot

    lỗi_trang 404 /404.html;
    vị trí = /404.html {
        gốc /root/công khai/;
        nội bộ;
    }

        địa điểm / {
                gốc /root/công khai/;
                chỉ số index.html;
        }

    vị trí ~* ^/(?:favicon|apple-touch-icon|android-chrome-|mstile-|safari-pinned-tab.svg|browserconfig.xml|mainfest.json) {
        bí danh /root/public/icons/icon-48x48.png;
    }

    vị trí ^~ /hình ảnh {
        bí danh /root/alimentacion;
        try_files $uri $uri/ =404;
    }

    vị trí/xếp hạng {
                proxy_pass http://xếp hạng;
        proxy_http_version 1.1;
        proxy_set_header Nâng cấp $http_upgrade;
        proxy_set_header Kết nối "nâng cấp";
                proxy_set_header Máy chủ lưu trữ $host;
        proxy_set_header X-Forwarded-Proto $scheme;
            proxy_set_header X-Forwarded-Port $server_port;
                proxy_buffer_size 128k;
                proxy_buffers 4 256k;
                proxy_busy_buffers_size 256k;
        }
}

Tại sao lại chuyển hướng người dùng đến another_example.com khi truy cập trực tiếp vào đường dẫn "/subdir"?

Ứng dụng Spring Boot không có bất cứ thứ gì trong thư mục gốc, trong cục bộ khi bạn yêu cầu thư mục gốc của ứng dụng Khởi động mùa xuân trả về 404, đây có phải là sự cố không?

CHỈNH SỬA đầu ra nginx -T:

nginx: cú pháp file cấu hình /etc/nginx/nginx.conf là ok
nginx: file cấu hình /etc/nginx/nginx.conf kiểm tra thành công
# tập tin cấu hình /etc/nginx/nginx.conf:
người dùng gốc;
worker_processes tự động;
pid /run/nginx.pid;
bao gồm /etc/nginx/modules-enabled/*.conf;

sự kiện {
    công_nhân kết_nối 768 ;
    # đa_chấp vào ;
}

http {

    ##
    # Cài đặt cơ bản
    ##

    gửi tệp trên;
    bật tcp_nopus;
    bật tcp_nodelay;
    keepalive_timeout 65;
    loại_hash_max_size 2048;
    server_tokens tắt;
    client_max_body_size 180M; #Â cho phép khách hàng tải lên các tệp 180 MB

    # server_name_hash_bucket_size 64;
    # máy chủ_tên_trong_chuyển hướng tắt;

    bao gồm /etc/nginx/mime.types;
    ứng dụng default_type/octet-stream;

    ##
    # Cài đặt SSL
    ##

    ssl_protocols TLSv1 TLSv1.1 TLSv1.2; # Bỏ SSLv3, tham khảo: POODLE
    bật ssl_prefer_server_ciphers;

    ##
    # Cài đặt ghi nhật ký
    ##

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

    ##
    # Cài đặt Gzip
    ##

    bật gzip;

    bật gzip_vary;
    gzip_proxied bất kỳ;
    gzip_comp_level 6;
    gzip_buffers 16 8k;
    gzip_http_version 1.1;
    văn bản gzip_types/văn bản thuần túy/ứng dụng css/ứng dụng json/văn bản javascript/ứng dụng xml/ứng dụng xml/xml+văn bản rss/javascript;

    ##
    # Cân bằng tải
    ##
    ngược dòng uv {
        máy chủ cục bộ: 8081;
    }

    kiểm tra ngược dòng {
        máy chủ cục bộ: 8087;
    }

    phụ trợ ngược dòng {
        máy chủ cục bộ: 8085;
    }

    xếp hạng ngược dòng {
        máy chủ cục bộ: 4000;
    }

    ##
    # Cấu hình máy chủ ảo
    ##

    bao gồm /etc/nginx/conf.d/*.conf;
    bao gồm /etc/nginx/sites-enabled/*;
}

# tệp cấu hình /etc/nginx/modules-enabled/50-mod-http-geoip.conf:
mô-đun load_module/ngx_http_geoip_module.so;

# tệp cấu hình /etc/nginx/modules-enabled/50-mod-http-image-filter.conf:
mô-đun load_module/ngx_http_image_filter_module.so;

# tệp cấu hình /etc/nginx/modules-enabled/50-mod-http-xslt-filter.conf:
mô-đun load_module/ngx_http_xslt_filter_module.so;

# tệp cấu hình /etc/nginx/modules-enabled/50-mod-mail.conf:
mô-đun load_module/ngx_mail_module.so;

# tệp cấu hình /etc/nginx/modules-enabled/50-mod-stream.conf:
mô-đun load_module/ngx_stream_module.so;

# tập tin cấu hình /etc/nginx/mime.types:

các loại {
    văn bản/html html htm shtml;
    văn bản/css css;
    văn bản/xml xml;
    hình ảnh/gif gif;
    hình ảnh/jpeg jpeg jpg;
    ứng dụng/javascript js;
    ứng dụng/nguyên tử + nguyên tử xml;
    ứng dụng/rss+xml rss;

    văn bản/toán học mml;
    văn bản/txt đơn giản;
    text/vnd.sun.j2me.app-descriptor jad;
    text/vnd.wap.wml wml;
    văn bản/x-thành phần htc;

    hình ảnh/png png;
    hình ảnh/tiff tif tiff;
    image/vnd.wap.wbmp wbmp;
    hình ảnh/biểu tượng x ico;
    hình ảnh/x-jng jng;
    hình ảnh/x-ms-bmp bmp;
    hình ảnh/svg+xml svg svgz;
    hình ảnh/webp webp;

    ứng dụng/phông chữ woff;
    ứng dụng/java-archive jar chiến tai;
    ứng dụng/json json;
    ứng dụng/mac-binhex40 hqx;
    tài liệu ứng dụng/msword;
    ứng dụng/pdf pdf;
    ứng dụng/tái bút ps eps ai;
    ứng dụng/rtf rtf;
    ứng dụng/vnd.apple.mpegurl m3u8;
    ứng dụng/vnd.ms-excel xls;
    ứng dụng/vnd.ms-fontobject eot;
    application/vnd.ms-powerpoint ppt;
    ứng dụng/vnd.wap.wmlc wmlc;
    ứng dụng/vnd.google-earth.kml+xml kml;
    ứng dụng/vnd.google-earth.kmz kmz;
    ứng dụng/x-7z-nén 7z;
    ứng dụng/x-ca cao cco;
    ứng dụng/x-java-archive-diff jardiff;
    ứng dụng/x-java-jnlp-tệp jnlp;
    ứng dụng/x-makeself chạy;
    ứng dụng/x-perl pl chiều;
    ứng dụng/x-pilot prc pdb;
    ứng dụng/x-rar-rar nén;
    ứng dụng/x-redhat-gói-quản lý rpm;
    ứng dụng/x-biển biển;
    ứng dụng/x-shockwave-flash swf;
    ứng dụng/x-stuffit ngồi;
    ứng dụng/x-tcl tcl tk;
    ứng dụng/x-x509-ca-cert der pem crt;
    ứng dụng/x-xpinstall xpi;
    ứng dụng/xhtml+xml xhtml;
    ứng dụng/xspf+xml xspf;
    ứng dụng/zip zip;

    ứng dụng/octet-stream bin exe dll;
    gỡ lỗi ứng dụng/octet-stream;
    ứng dụng/octet-stream dmg;
    ứng dụng/octet-stream iso img;
    ứng dụng/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;

    âm thanh/midi mid midi kar;
    âm thanh/mpeg mp3;
    âm thanh/ogg ogg;
    âm thanh/x-m4a m4a;
    âm thanh/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;
}

# tệp cấu hình /etc/letsencrypt/options-ssl-nginx.conf:
# Tệp này chứa các tham số bảo mật quan trọng. Nếu bạn sửa đổi tập tin này
# theo cách thủ công, Certbot sẽ không thể tự động cung cấp bảo mật trong tương lai
# cập nhật. Thay vào đó, Certbot sẽ in và ghi lại thông báo lỗi với đường dẫn đến
# tệp cập nhật mà bạn sẽ cần tham khảo khi cập nhật thủ công
# tập tin này.

ssl_session_cache được chia sẻ:le_nginx_SSL:1m;
ssl_session_timeout 1440m;

ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
bật ssl_prefer_server_ciphers;

ssl_ciphers "ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE- RSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128- SHA:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA:ECDHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA256: 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";

# tệp cấu hình /etc/nginx/sites-enabled/example:
người phục vụ {
        nghe 80;
        server_name example.com www.example.com;
        trả lại 301 https://example.com$request_uri;
}

người phục vụ {
        nghe 443 ssl;

        server_name example.com www.example.com;

        gốc /root/wordpress_example;
        chỉ số index.php;

        ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem; # được quản lý bởi Certbot
        ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem; # được quản lý bởi Certbot

        bao gồm /etc/letsencrypt/options-ssl-nginx.conf; # được quản lý bởi Certbot
        ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # được quản lý bởi Certbot

        vị trí = /favicon.ico { log_not_found tắt; truy cập_đăng xuất; }
        vị trí = /robots.txt { log_not_found tắt; truy cập_đăng xuất; chấp nhận tất cả; }
        vị trí ~* \.(css|gif|ico|jpeg|jpg|js|png)$ {
                hết hạn tối đa;
                log_not_found tắt;
        }

        địa điểm / {
                try_files $uri $uri/ /index.php?$args;
        }

        vị trí ~ \.php$ {
                bao gồm fastcgi_params;
                bật fastcgi_intercept_errors;
                fastcgi_pass unix:/var/run/php/php8.0-fpm.sock;
                fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        }

        vị trí /thư mục con/ {
                proxy_pass http://127.0.0.1:8080/;
                proxy_redirect tắt;
                proxy_buffer_size 128k;
                proxy_buffers 4 256k;
                proxy_busy_buffers_size 256k;
        }

        vị trí = /subdir {
                proxy_pass http://127.0.0.1:8080/;
                proxy_redirect tắt;
                proxy_buffer_size 128k;
                proxy_buffers 4 256k;
                proxy_busy_buffers_size 256k;
        }
}

# tập tin cấu hình /etc/nginx/fastcgi_params:

fastcgi_param QUERY_STRING $query_string;
fastcgi_param REQUEST_METHOD $request_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 $scheme;
fastcgi_param HTTPS $https if_not_empty;

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

fastcgi_param REMOTE_ADDR $remote_addr;
fastcgi_param REMOTE_PORT $remote_port;
fastcgi_param SERVER_ADDR $server_addr;
fastcgi_param SERVER_PORT $server_port;
fastcgi_param SERVER_NAME $server_name;

# Chỉ PHP, bắt buộc nếu PHP được xây dựng với --enable-force-cgi-redirect
fastcgi_param REDIRECT_STATUS 200;

# tệp cấu hình /etc/nginx/sites-enabled/another_example:
người phục vụ {
        nghe 80;
        server_name another_example.com www.another_example.com;
        trả lại 301 https://another_example.com$request_uri;
}

người phục vụ {
    underscores_in_headers bật;
        nghe 443 ssl;

        server_name another_example.com www.another_example.com;

        ssl_certificate /etc/letsencrypt/live/another_example.com/fullchain.pem; # được quản lý bởi Certbot
        ssl_certificate_key /etc/letsencrypt/live/another_example.com/privkey.pem; # được quản lý bởi Certbot

        bao gồm /etc/letsencrypt/options-ssl-nginx.conf; # được quản lý bởi Certbot
        ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # được quản lý bởi Certbot

    lỗi_trang 404 /404.html;
    vị trí = /404.html {
        gốc /root/công khai/;
        nội bộ;
    }

        địa điểm / {
                gốc /root/công khai/;
                chỉ số index.html;
        }

    vị trí ~* ^/(?:favicon|apple-touch-icon|android-chrome-|mstile-|safari-pinned-tab.svg|browserconfig.xml|mainfest.json) {
        bí danh /root/public/icons/icon-48x48.png;
    }

    vị trí ^~ /hình ảnh {
        bí danh /root/alimentacion;
        try_files $uri $uri/ =404;
    }

    vị trí/xếp hạng {
                proxy_pass http://xếp hạng;
        proxy_http_version 1.1;
        proxy_set_header Nâng cấp $http_upgrade;
        proxy_set_header Kết nối "nâng cấp";
                proxy_set_header Máy chủ lưu trữ $host;
        proxy_set_header X-Forwarded-Proto $scheme;
            proxy_set_header X-Forwarded-Port $server_port;
                proxy_buffer_size 128k;
                proxy_buffers 4 256k;
                proxy_busy_buffers_size 256k;
        }
}

CHỈNH SỬA VỚI GIẢI PHÁP:

Với sự giúp đỡ của @Tero Kilkanen và thử và sai, tôi đã tìm ra giải pháp:

    vị trí /thư mục con/ {
            proxy_pass http://127.0.0.1:8080/;
            proxy_redirect tắt;
    }

    vị trí = /subdir {
            proxy_pass http://127.0.0.1:8080;
            proxy_redirect tắt;
    }

    vị trí = /subdir/ {
            proxy_pass http://127.0.0.1:8080;
            proxy_redirect tắt;
    }
Điểm:2
lá cờ us

vị trí /thư mục con/ khớp với các yêu cầu có URI /thư mục con/.

Trong yêu cầu ví dụ của bạn, URI là /thư mục con. do đó địa điểm khối không được sử dụng.

Yêu cầu sau đó được xử lý bởi địa điểm /, và sau đó index.php của ứng dụng đó làm một cái gì đó.

Để làm cho /thư mục con để đi đến cùng một vị trí, bạn cần thêm một vị trí khác địa điểm chặn:

vị trí = /subdir {
        proxy_pass http://127.0.0.1:8080/;
        proxy_redirect tắt;
        proxy_buffer_size 128k;
        proxy_buffers 4 256k;
        proxy_busy_buffers_size 256k;
}

Các = thuộc tính làm cho điều này khớp chính xác và nó được xử lý trước bởi nginx.

Nico avatar
lá cờ br
Tôi đã thử cách này nhưng không hiệu quả, khi tôi truy cập https://example.com/subdir, nó sẽ tự động thêm dấu '/' vào cuối. không biết tại sao
lá cờ us
Bạn đã thử với trình duyệt mà bạn đã sử dụng trước đó để kiểm tra chưa? Nếu có, thì trình duyệt có thể đã lưu vào bộ đệm chuyển hướng 301 mà nginx gửi khi tìm thấy một thư mục có cùng tên với URI. Vui lòng kiểm tra với `curl -v`.
Nico avatar
lá cờ br
Tôi đã thử nghiệm với `curl -v` và vẫn xảy ra, nó trả về nội dung index.html của miền "another_example.com" thay vì ủy quyền cho `http://127.0.0.1:8080/`
lá cờ us
Và bạn đã khởi động lại nginx đúng cách chưa?
Nico avatar
lá cờ br
vâng, tôi đã tải lại trước và bây giờ khi bạn hỏi tôi đã khởi động lại và điều tương tự, nhưng bây giờ (với trình duyệt ở chế độ ẩn danh), cuối cùng '/' bổ sung không được thêm vào nhưng vẫn trả về index.html của cấu hình khác và cả với `curl -v`
lá cờ us
Vui lòng thêm đầu ra của `nginx -T` vào câu hỏi ban đầu.
Nico avatar
lá cờ br
Xong, tôi đã chỉnh sửa câu hỏi gốc với đầu ra của lệnh `nginx -T`
Nico avatar
lá cờ br
Được rồi, tôi đã khắc phục sự cố loại bỏ phản ứng dữ dội trong thẻ proxy: `proxy_pass http://127.0.0.1:8080/;` thành `proxy_pass http://127.0.0.1:8080;` theo cách này tôi không bị chuyển hướng đến máy chủ web khác, nhưng nếu trong trình duyệt tôi đặt URL có "/subdir/" thì tôi được chuyển hướng đến một ứng dụng khác

Đăng câu trả lời

Hầu hết mọi người không hiểu rằng việc đặt nhiều câu hỏi sẽ mở ra cơ hội học hỏi và cải thiện mối quan hệ giữa các cá nhân. Ví dụ, trong các nghiên cứu của Alison, mặc dù mọi người có thể nhớ chính xác có bao nhiêu câu hỏi đã được đặt ra trong các cuộc trò chuyện của họ, nhưng họ không trực giác nhận ra mối liên hệ giữa câu hỏi và sự yêu thích. Qua bốn nghiên cứu, trong đó những người tham gia tự tham gia vào các cuộc trò chuyện hoặc đọc bản ghi lại các cuộc trò chuyện của người khác, mọi người có xu hướng không nhận ra rằng việc đặt câu hỏi sẽ ảnh hưởng—hoặc đã ảnh hưởng—mức độ thân thiện giữa những người đối thoại.