Tại sao Nginx chấp nhận bất kỳ giá trị URL nào sau tên miền gốc?


2

Lần đầu tiên thiết lập Nginx và mục tiêu của tôi là có example.com với trang 'index.html' tĩnh được phục vụ với cấu hình tối giản, không có gì hơn. Tôi cũng muốn bỏ tên miền phụ www. Dưới đây là các khối máy chủ có sẵn trên trang web của tôi:

server {
    server_name www.example.com;
    return 301 $scheme://example.com$request_uri;
}

server {
    server_name example.com;
    root /var/www/example.com/;
    index index.html index.htm;

    location / {
            try_files $uri $uri/ /index.html;
    }
}

Nếu tôi sử dụng www.example.com hoặc example.com thì chúng hoạt động tốt, với www sẽ tự động bị loại bỏ.

Vấn đề của tôi là tôi có thể nhập bất cứ thứ gì sau example.com và trang index.html vẫn tải, như example.com/ABC hoặc example.com/12345. Các trang này không tồn tại, tại sao các URL được chấp nhận? Thay vào đó, tôi mong đợi bất kỳ URL nào ngoài gốc miền sẽ trả về trang 404.

Đây có lẽ là một vấn đề rất đơn giản nhưng tôi đã thử tìm kiếm ở đây & trong các tài liệu và tôi không tìm thấy gì cho đến nay.

Câu trả lời:


4

Có vẻ như hành vi đúng của mệnh đề try_files. Từ wiki nginx:

Kiểm tra sự tồn tại của các tệp theo thứ tự và trả về tệp đầu tiên được tìm thấy. Dấu gạch chéo chỉ ra một thư mục - $ uri /. Trong trường hợp không tìm thấy tệp nào, một chuyển hướng nội bộ đến tham số cuối cùng được gọi. Xin lưu ý rằng chỉ tham số cuối cùng gây ra chuyển hướng nội bộ, các tham số trước chỉ đặt con trỏ URI bên trong.

Vì vậy, nếu bạn tìm ABC hoặc 12345, không thể tìm thấy, một chuyển hướng nội bộ đến index.html được gọi.

Hãy thử với:

location / {
    try_files $uri $uri/ =404;
}

Nhìn vào đây để tham khảo đầy đủ:

http://nginx.org/en/docs/http/ngx_http_core_module.html#try_files

Dựa trên nhận xét của Martin Fjordvald ở đây là cấu hình tối thiểu cho hai khối máy chủ, đã được thử nghiệm và hoạt động:

server {
    server_name www.example.com;
    return 301 $scheme://example.com$request_uri;
}

server {
    server_name example.com;
    root /var/www/example.com/;
    index index.html index.htm;
}

Tôi không thấy chuyển hướng đến example.com nếu tôi nhập example.com/12345, trang index.html được trả về cho mọi thứ. example.com/12345 được chấp nhận và index.html được hiển thị tại URL đó. Tôi đang mong đợi một 404 hoặc cho / 12345 sẽ bị loại bỏ cuối cùng?
Tom Brossman

Đó là một chuyển hướng nội bộ, tôi sẽ không thấy phản hồi 3xx cho khách hàng. Hãy thử xóa /index.html ở cuối mệnh đề try_files
Guido Vaccarella

Chỉ cần thử nó và bây giờ example.com/123 trả về '500 Lỗi máy chủ nội bộ'. Error.log hiển thị [error] 11072#0: *898 rewrite or internal redirection cycle while internally redirecting to "/123". Đây không phải là một 404 thay vào đó? Điều này thật khó chịu và tôi nghi ngờ đó là một cái gì đó thực sự cơ bản. Cảm ơn lời khuyên mặc dù.
Tom Brossman

1
Tôi đã chỉnh sửa câu trả lời của mình bằng một ví dụ về cấu hình
Guido Vaccarella

2
Chỉ dành cho bản ghi, try_files $ uri $ uri / = 404; giống như chỉ loại bỏ try_files. Ngay bây giờ bạn rõ ràng đang hướng dẫn nginx thực hiện hành vi mặc định của nó. Không ai nói bạn phải sử dụng try_files.
Martin Fjordvald

1

2 điều tôi có thể nghĩ đến:

hoặc bạn có một bản viết lại cho index.html

hoặc có thể bạn có một trang 404 tùy chỉnh được liên kết lại với index.html

ít nhất đó sẽ là 2 ý tưởng đầu tiên tôi sẽ kiểm tra.

giải pháp khả thi khác sẽ là kiểm tra nhật ký, đặt giá trị để gỡ lỗi và kiểm tra xem "chuyển hướng" nào bạn quay lại index.html thật đáng buồn là tôi không biết nginx đủ tốt để hỗ trợ bạn thêm.


Cảm ơn đã trả lời nhanh, nhưng đó là cấu hình hoàn chỉnh của tôi ở đó. Không có bất kỳ quy tắc viết lại hoặc các trang 404 tùy chỉnh. Tôi đã lấy các trang web Nginx mặc định được kích hoạt và xóa tất cả các dòng nhận xét và mặc định và bây giờ tôi đã tạo ra một mớ hỗn độn về nó.
Tom Brossman
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.