Làm cách nào để định cấu hình khối vị trí để luôn trả về một tệp trong nginx?


12

Trong ứng dụng của mình, tôi muốn vị trí "/" trả về tệp index.html tĩnh, tôi muốn "/ static" phục vụ các tệp tĩnh từ một thư mục và tôi muốn tất cả các yêu cầu khác trả về 404 KHÔNG TÌM KIẾM. Sau đó, tôi sẽ chuyển hướng tất cả các yêu cầu khác đến máy chủ WSGI.

Đây hiện là cấu hình của tôi:

# Dev server.
server {
    listen 1337;
    charset UTF-8;

    location / {
        rewrite ^ static/index_debug.html break;
    }

    location /static {
        alias /home/tomas/projects/streamcore/static;
    }
}

Thư mục tĩnh đang hoạt động hoàn hảo, nhưng "/" đang trả về 404 KHÔNG TÌM KIẾM. Tôi cũng đã thử:

alias /home/tomas/projects/streamcore/static/index_debug.html;

Trong khối vị trí, nhưng trả về 500 L ERI MÁY CHỦ NỘI BỘ. Có vẻ như aliaskhông thích các tập tin đơn lẻ. Ngoài ra, tôi đã thử:

try_files static/index_debug.html;

Nhưng điều đó ngăn máy chủ bắt đầu với lỗi "số lượng đối số không hợp lệ trong chỉ thị try_files". Rõ ràng try_filesthực sự đòi hỏi bạn phải thử nhiều hơn một tệp, đó không phải là hành vi tôi đang tìm kiếm.

Vì vậy, câu hỏi của tôi là: Làm thế nào để tôi định cấu hình một khối vị trí để luôn trả về một tệp tĩnh?


EDIT: Tôi đã thấy từ các câu trả lời khác aliasthực sự nên chấp nhận một tệp duy nhất làm đối số, vì vậy tôi đã thử:

location = / {
    alias /home/tomas/projects/streamcore/static/index_debug.html;
}

Nhưng tôi vẫn chỉ nhận được 500 LỚP MÁY CHỦ NỘI BỘ. Nhật ký lỗi cho yêu cầu "/" cho biết:

[alert] 28112 # 0: * 7 "/home/tomas/projects/streamcore/static/index_debug.htmlindex.html" không phải là một thư mục

Tại sao nó lại cố mở "index_debug.htmlindex.html"? Tôi không sử dụng indexchỉ thị ở bất cứ đâu.


Bạn có thểtry_files static/index_debug.html static/index_debug.html;
ceejayoz

@ceejayoz: Thử đề xuất của bạn với location =/Tôi nhận 404 KHÔNG TÌM KIẾM, với location /tôi nhận được 500 L ERI MÁY CHỦ NỘI BỘ.
Hubro

Nếu tôi không sai, bạn đang thiếu chỉ thị Index ... Bất kỳ máy chủ web nào cũng sẽ luôn tìm tệp chỉ mục, cung cấp URI gốc (/), tôi nghĩ bạn có thể ghi đè lên điều này bằng cách thêm:location / { return 404; }
Martino Dino

@MartinoDino: Tại sao tôi cần nó? Và ở đâu?
Hubro

location = / {Index /home/tomas/projects/streamcore/static/index_debug.html;}
Martino Dino

Câu trả lời:


10

Chỉ cần thử nghiệm điều này và nó hoạt động với tôi:

server {
    root /tmp/root;
    server {
        listen 8080;
        location /static {
            try_files $uri =404;
        }
        location / {
            rewrite ^ /static/index_debug.html break;
        }
    }
}

Các tập tin /tmp/root/static/index_debug.htmltồn tại tất nhiên :)

Tôi có thể nhấn bất kỳ URL nào và tôi chỉ cần lấy trang tĩnh.


0

Bạn có thể sử dụng try_files và chuyển hướng đến một vị trí được đặt tên bằng cách viết lại. Như thế này:

server {
    root /tmp/root;
    server {
        listen 8080;

        location / {
            try_files $uri $uri/ @index;
        }

        location @index {
            rewrite ^ static/index_debug.html break;
        }
    }
}

Nếu tập tin tồn tại trong /tmp/rootnó sẽ được phục vụ, nếu không uri sẽ được viết lại static/index_debug.htmlvà nó sẽ được phục vụ.

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.