Nhận Nginx để luôn phục vụ chỉ mục


2

Làm cách nào tôi có thể khiến nginx luôn phục vụ index.html bất kể URL là gì?

Ví dụ: tôi muốn URL https://www.example.me/723738 để luôn phục vụ https://www.example.me/index.html

Tôi không muốn sử dụng lại trực tiếp, vì người dùng vẫn phải có URL gốc mà họ đã nhập vào thanh địa chỉ.

Tôi thay đổi cấu hình Nginx để chuyển hướng 404 thành index.html, nhưng tôi không nghĩ đó là một cách tuyệt vời để làm điều đó bởi vì nó sẽ trả về phản hồi 404.

Trong tương lai tôi có thể muốn index.html hiển thị URL gốc mà người dùng đã truy cập, có cách nào để làm điều này không?

Cảm ơn

Câu trả lời:


1

Trả lời câu hỏi 1:

Chức năng bạn đang tìm kiếm được gọi là viết lại URL. Điều này cho phép bạn tạo mặt nạ (hoặc URL "giả") hiển thị tài nguyên nằm trên các URL khác nhau.

Trong Nginx điều này đạt được bởi rewrite <regexp-pattern> <target-url> lệnh trong tập tin cấu hình. Đây là cấu hình Nginx cho tên miền www.example.com:

server {
    listen 80;
    server_name www.example.com;

    root /var/www/example.com;
    index index.html;

    rewrite ^.*$ /index.html;
}

Các <regexp-pattern> Phần (EXPular EXPression) được so sánh với url bạn đã nhập vào trình duyệt - nếu trận đấu thành công, tài nguyên tại <target-url> được hiển thị.

Trả lời cho câu hỏi 2:

URL hiện tại không thể được hiển thị chỉ với tài liệu HTML thuần túy. Bạn sẽ cần sử dụng ngôn ngữ kịch bản phía máy chủ - ví dụ PHP. Điều này sẽ cho phép bạn hiển thị nội dung động cho người dùng. Có rất nhiều hướng dẫn về PHP với Nginx ( https://askubfox.com/a/134676 ) và về chủ đề làm thế nào để hiển thị URL hiện tại từ PHP ( https://stackoverflow.com/a/6768831 ).


3

Các mô hình phổ biến sử dụng try_files với một URI mặc định. Đối với một ví dụ tối giản:

server {
    root /path/to/root;
    location / {
        try_files $uri $uri/ /index.html;
    }
}

Xem tài liệu này để biết thêm


Điều này rõ ràng đơn giản hơn (mặt khác nó không che dấu các tệp hiện có khác trong thư mục).
Marek Rost

1
Rất đúng, nhưng thường có các tệp tài nguyên cần được kéo vào index.html đó là lý do tại sao tôi trình bày giải pháp chung trước tiên
Richard Smith

Điều gì xảy ra nếu tôi muốn các tệp hiện có cũng được viết lại / chuyển hướng đến /index.html?
Elgs Qian Chen

1
@ElssQianChen sử dụng try_files /index.html =404; hoặc là rewrite ^ /index.html break;. Nhưng không có thay đổi khác, nó sẽ phá vỡ quyền truy cập vào các tệp tài nguyên của bạn (JS. CSS, IMG).
Richard Smith

0

Đây là mã bạn đang tìm kiếm

server {
listen 80 default_server;
listen [::]:80 default_server;
server_name _;
root /var/www/;
index index.html;

location = /favicon.ico { access_log off; log_not_found off; }

error_page 404 =200 /;
}

Với tên máy chủ _; Anh nghe từ bất kỳ ip, tên miền.

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.