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.


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;
}

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;
}

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.


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/;
}

10

Ini bekerja untuk saya:

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

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.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.