nginx: gửi tất cả các yêu cầu đến một trang html


156

Sử dụng nginx, tôi muốn duy trì url, nhưng thực sự tải cùng một trang bất kể điều gì. Tôi sẽ sử dụng url History.getState()để định tuyến các yêu cầu trong ứng dụng javascript của mình. Có vẻ như nó là một điều đơn giản để làm gì?

location / {
    rewrite (.*) base.html break;
}

hoạt động, nhưng chuyển hướng url? Tôi vẫn cần url, tôi chỉ muốn luôn sử dụng cùng một trang.


6
Cảm ơn bạn đã hỏi câu hỏi này để câu trả lời đã sẵn sàng cho tôi :-)
Lasse Bunk

Câu trả lời:


191

Tôi nghĩ rằng điều này sẽ làm điều đó cho bạn:

location / {
    try_files /base.html =404;
}

1
[nổi lên] 613 # 0: số lượng đối số không hợp lệ trong chỉ thị "try_files"?
prismofeverything

2
Ok hãy thử điều này: try_files $ uri /base.html;
Alex Howansky

5
Lưu ý - điều này trước tiên sẽ kiểm tra tệp được yêu cầu và nếu nó không ở đó, nó sẽ phục vụ base.html. Vì vậy, hãy đảm bảo rằng bạn không có tệp bổ sung cũ nào nằm trong thư mục gốc của tài liệu hoặc chúng sẽ được phục vụ trực tiếp nếu được yêu cầu.
Alex Howansky

22
Sử dụng try_files '' /base.html;(chuỗi rỗng làm đối số đầu tiên để try_files) tránh việc tra cứu tệp được gọi $uri.
davidjb

17
try_files '' /base.html;đã cho tôi một vấn đề chuyển hướng và một lỗi máy chủ nội bộ, nhưng sửa đổi nó để try_files '' /base.html =404;khắc phục điều đó, nếu nó giúp được bất cứ ai.
William Turrell

30

Sử dụng chỉ try_fileskhông làm việc cho tôi - nó gây ra lỗi viết lại hoặc lỗi chu kỳ chuyển hướng nội bộ trong nhật ký của tôi.

Các tài liệu Nginx có một số chi tiết bổ sung:

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

Vì vậy, tôi đã kết thúc bằng cách sử dụng như sau:

root /var/www/mysite;

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

location = /base.html {
    expires 30s;
}

1
try_files '' /base.html =404;(xem bên trên)
Marc

Điều này làm việc cho tôi, nhưng tôi thực sự không cần location = /base.html { expires 30s }một phần.
maechler

17

Viết lại ban đầu của bạn sẽ gần như làm việc. Tôi không chắc tại sao nó lại chuyển hướng, nhưng tôi nghĩ những gì bạn thực sự muốn chỉ là

rewrite ^ /base.html break;

Bạn sẽ có thể đặt nó ở một vị trí hoặc trực tiếp trong máy chủ.


13

Điều này làm việc cho tôi:

location / {
    alias /path/to/my/indexfile/;
    try_files $uri /index.html;
}

Điều này cho phép tôi tạo một URL bắt tất cả cho ứng dụng một trang javascript. Tất cả các tệp tĩnh như css, phông chữ và javascript được tạo bởi npm run build sẽ được tìm thấy nếu chúng nằm trong cùng thư mục với index.html.

Nếu các tệp tĩnh nằm trong một thư mục khác, vì một số lý do, bạn cũng cần một cái gì đó như:

# Static pages generated by "npm run build"
location ~ ^/css/|^/fonts/|^/semantic/|^/static/ {
    alias /path/to/my/staticfiles/;
}

10

Điều này làm việc cho tôi:

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

7

Cách chính xác sẽ là:

location / {
    rewrite (.*) base.html last;
}

Sử dụng lastsẽ làm cho nginx tìm thấy một locationkhối phù hợp mới theo kết quả của việc viết lại.

try_files cũng là một cách tiếp cận hoàn toàn hợp lệ cho vấn đề này.

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.