Bagaimana cara mengkonfigurasi blok lokasi untuk selalu mengembalikan satu file di nginx?

12

Dalam aplikasi saya, saya ingin lokasi "/" mengembalikan file index.html statis, saya ingin "/ statis" untuk menyajikan file statis dari folder dan saya ingin semua permintaan lain untuk mengembalikan 404 TIDAK DITEMUKAN. Pada titik selanjutnya saya akan mengarahkan semua permintaan lain ke server WSGI.

Ini adalah konfigurasi saya saat ini:

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

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

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

Folder statis berfungsi dengan baik, tetapi "/" mengembalikan 404 TIDAK DITEMUKAN. Saya juga sudah mencoba:

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

Di blok lokasi, tetapi itu mengembalikan 500 INTERNAL SERVER ERROR. Sepertinya aliastidak suka file tunggal. Selain itu saya sudah mencoba:

try_files static/index_debug.html;

Tapi itu menghentikan server dari memulai dengan kesalahan "jumlah argumen yang tidak valid di direct_files directive". Rupanya try_filessebenarnya mengharuskan Anda untuk mencoba lebih dari satu file, yang bukan perilaku yang saya cari.

Jadi pertanyaan saya adalah: Bagaimana saya mengonfigurasi blok lokasi untuk selalu mengembalikan file statis?


EDIT: Saya sudah melihat dari jawaban lain yang aliasseharusnya menerima satu file sebagai argumen, jadi saya mencoba:

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

Tapi saya masih hanya mendapat 500 KESALAHAN SERVER INTERNAL. Log kesalahan untuk permintaan "/" mengatakan:

[alert] 28112 # 0: * 7 "/home/tomas/projects/streamcore/static/index_debug.htmlindex.html" bukan direktori

Mengapa ia mencoba membuka "index_debug.htmlindex.html"? Saya tidak menggunakan indexarahan di mana pun.

Hubro
sumber
Bisakah Andatry_files static/index_debug.html static/index_debug.html;
ceejayoz
@ceejayoz: Mencoba saran Anda dengan location =/saya mendapatkan 404 TIDAK DITEMUKAN, dengan location /saya mendapatkan 500 KESALAHAN SERVER INTERNAL.
Hubro
Jika saya tidak salah, Anda kehilangan direktif Index ... Server web mana pun akan selalu mencari file indeks, memberikan root URI (/), saya pikir Anda dapat menimpanya dengan menambahkan:location / { return 404; }
Martino Dino
@MartinoDino: Mengapa saya membutuhkannya? Dan dimana?
Hubro
location = / {Index /home/tomas/projects/streamcore/static/index_debug.html;}
Martino Dino

Jawaban:

10

Baru saja menguji ini dan itu berfungsi untuk saya:

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

File itu /tmp/root/static/index_debug.htmlada tentu saja :)

Saya dapat menekan URL apa saja dan saya hanya mendapatkan halaman statis.

chrskly
sumber
0

Anda dapat menggunakan try_files dan mengarahkan ulang ke lokasi yang ditentukan dengan menulis ulang. Seperti ini:

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

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

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

Jika ada file di /tmp/rootdalamnya akan dilayani, jika tidak uri akan ditulis ulang static/index_debug.htmldan akan dilayani.

Kirill Zaitsev
sumber