nginx: tüm istekleri tek bir html sayfasına gönder


156

Nginx kullanarak, url'yi korumak istiyorum, ama aslında ne olursa olsun aynı sayfayı yükleyin. History.getState()Javascript uygulamamdaki istekleri yönlendirmek için URL'yi kullanacağım . Basit bir şey mi olmalı?

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

çalışır, ancak URL'yi yönlendirir? Hala URL'ye ihtiyacım var, her zaman aynı sayfayı kullanmak istiyorum.


6
Bu soruyu sorduğunuz için teşekkür ederim, bu yüzden cevap benim için hazırdı :-)
— Lasse Bunk

Yanıtlar:


191

Bunun sizin için yapacağını düşünüyorum:

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

1
[ortaya çıktı] 613 # 0: "try_files" yönergesinde geçersiz sayıda argüman var mı?
— prismofeverything

2
Tamam şunu deneyin: try_files $ uri /base.html;
— Alex Howansky

5
Not - bu önce istenen dosyayı kontrol eder ve orada değilse, base.html'ye hizmet eder. Bu nedenle, belge kök dizininizde eski dosyalarınız olmadığından emin olun, aksi takdirde sorgulanırlarsa doğrudan sunulurlar.
— Alex Howansky

22
Kullanılması try_files '' /base.html;(ilk argüman olarak boş bir dize try_files) olarak adlandırılan bir dosyanın aramasını önler $uri.
— davidjb

17
try_files '' /base.html;bana bir yönlendirme sorunu ve bir dahili sunucu hatası verdi, ancak try_files '' /base.html =404;herhangi birine yardımcı olursa düzeltildi.
— William Turrell

30

Kullanmak try_filesbenim için işe yaramadı - günlüklerimde yeniden yazma veya dahili yönlendirme döngüsü hatasına neden oldu .

Nginx belgelerinde bazı ek ayrıntılar vardı:

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

Bu yüzden aşağıdakileri kullanarak sonuçlandırdım:

root /var/www/mysite;

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

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

1
try_files '' /base.html =404;(yukarıya bakın)
— Marc

Bu benim için çalıştı, ama aslında bu location = /base.html { expires 30s }parçaya ihtiyacım yoktu .
— maechler

17

Orijinal yeniden yazmanız neredeyse işe yarayacaktır. Neden yönlendirme yapacağından emin değilim ama bence gerçekten istediğin sadece

rewrite ^ /base.html break;

Bunu bir konuma veya doğrudan sunucuya koyabilirsiniz.


13

Bu benim için çalıştı:

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

Bu, bir javascript tek sayfalık uygulama için tümünü yakalama URL'si oluşturmama izin verdi. Css, fonts ve javascript gibi tüm statik dosyalar npm run build , ile aynı dizinde bulunuyorsa bulunur index.html.

Statik dosyalar başka bir dizindeyse, herhangi bir nedenle, aşağıdakilere de ihtiyacınız vardır:

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

10

Bu benim için çalıştı:

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

7

Doğru yol:

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

lastNginx kullanıldığında location, yeniden yazma sonucuna göre yeni bir blok bulunacaktır .

try_files aynı zamanda bu probleme tam anlamıyla geçerli bir yaklaşımdır.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.