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.