nginx: kirim semua permintaan ke satu halaman html

156

Menggunakan nginx, saya ingin mempertahankan url, tetapi sebenarnya memuat halaman yang sama tidak peduli apa. Saya akan menggunakan url dengan History.getState()untuk merutekan permintaan di aplikasi javascript saya. Sepertinya itu harus menjadi hal yang sederhana untuk dilakukan?

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

berfungsi, tetapi mengalihkan url? Saya masih membutuhkan url, saya hanya ingin selalu menggunakan halaman yang sama.

prismofeverything
sumber
6
Terima kasih telah mengajukan pertanyaan ini sehingga jawabannya siap untuk saya :-)
Lasse Bunk

Jawaban:

191

Saya pikir ini akan melakukannya untuk Anda:

location / {
    try_files /base.html =404;
}
Alex Howansky
sumber
1
[emerg] 613 # 0: jumlah argumen yang tidak valid dalam arahan "try_files"?
prismofeverything
2
Oke coba ini: try_files $ uri /base.html;
Alex Howansky
5
Catatan - ini pertama-tama akan memeriksa file yang diminta, dan jika tidak ada di sana, itu akan melayani base.html. Jadi pastikan Anda tidak punya file tambahan lama yang ada di direktori root dokumen Anda, atau mereka akan dilayani langsung jika ditanya.
Alex Howansky
22
Menggunakan try_files '' /base.html;(string kosong sebagai argumen pertama untuk try_files) menghindari pencarian file yang disebut $uri.
davidjb
17
try_files '' /base.html;memberi saya masalah pengalihan dan kesalahan server internal, tetapi memodifikasinya untuk try_files '' /base.html =404;memperbaikinya, jika itu membantu siapa pun.
William Turrell
30

Hanya menggunakan try_filestidak bekerja untuk saya - itu menyebabkan kesalahan siklus pengalihan ulang atau internal di log saya.

Dokumen Nginx memiliki beberapa detail tambahan:

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

Jadi saya akhirnya menggunakan yang berikut ini:

root /var/www/mysite;

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

location = /base.html {
    expires 30s;
}
Kevan Stannard
sumber
1
try_files '' /base.html =404;(lihat di atas)
Marc
Ini bekerja untuk saya, tetapi saya sebenarnya tidak membutuhkan location = /base.html { expires 30s }bagian itu.
maechler
17

Penulisan ulang asli Anda hampir pasti berhasil. Saya tidak yakin mengapa itu akan mengarahkan, tapi saya pikir apa yang Anda inginkan sebenarnya adil

rewrite ^ /base.html break;

Anda harus dapat meletakkannya di lokasi atau langsung di server.

kolbyjack
sumber
13

Ini bekerja untuk saya:

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

Ini memungkinkan saya untuk membuat URL tampung semua untuk aplikasi satu halaman javascript. Semua file statis seperti css, font, dan javascript yang dibangun oleh npm run build akan ditemukan jika mereka berada di direktori yang sama denganindex.html .

Jika file statis berada di direktori lain, untuk beberapa alasan, Anda juga memerlukan sesuatu seperti:

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

Ini bekerja untuk saya:

location / {
    try_files $uri $uri/ /base.html;
}
Abhishek
sumber
7

Cara yang benar adalah:

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

Menggunakan lastakan membuat nginx menemukan yang cocok barulocation blok yang sesuai dengan hasil penulisan ulang.

try_files juga merupakan pendekatan yang sangat valid untuk masalah ini.

Etherealone
sumber