„Ukryj” .html rozszerzenia plików przy użyciu przepisywania nginx

16

Podaję stronę statyczną przez nginx, a moim celem jest zastąpienie adresów URL, które wyglądają jak:

http://foo.com/bar.html

z

http://foo.com/bar

Kluczem jest brak ukośnika końcowego. Obecnie robię coś podobnego przy użyciu aliasów lokalizacji, ale jest to żmudne, ponieważ wymaga bloku lokalizacji dla każdego pliku, a także dodaje ukośnik końcowy, ponieważ nginx patrzy na aliasy jako katalogi:

    location / {
        root    /srv/www/foo/public_html;
        index   index.html;
    }

    location /bar1 {
        alias /srv/www/foo/public_html/;
        index bar1.html;
    }

    location /bar2 {
        alias /srv/www/foo/public_html/;
        index bar2.html;
    }

I tak dalej. Przeczytałem dokumentację o przepisywaniu i nie mogę zsyntetyzować tego, co zostało powiedziane, do tego, czego potrzebuję. Nie pochodzę z tła Apache; nginx to moja pierwsza próba dostępu do serwerów sieciowych, więc jestem pewien, że brakuje mi czegoś oczywistego, ponieważ moje tło HTTP jest słabe. Z góry dziękuję za wszelką pomoc, którą możesz udzielić.

Doug Stephen
źródło

Odpowiedzi:

17

try_files powinno być tym, czego chcesz.

Coś takiego:

try_files $uri.html $uri $uri/ =404;
Shane Madden
źródło
1
To zadziałało, z niewielkim wyjątkiem, że $ uri.html powodował błąd 500. Musiałem użyć „$ {uri} .html”.
Doug Stephen
4
Zmiana na try_files $uri.html $uri/ =404;lepszą byłaby lepsza pod względem SEO, ponieważ nie masz dwóch adresów URL foobar.com/bar i foobar.com/bar.html wskazujących na ten sam zasób.
Khaja Minhajuddin
5

Według komentarza @ Khaja najlepszą odpowiedzią jest:

try_files $uri.html $uri/ =404;

Tak więc obsługiwana jest tylko jedna kopia zasobu (bez rozszerzenia .html). Nie chcesz dzielić siły linku na wiele adresów URL obsługujących zduplikowane treści. Znajdź dokumentację tutaj .

Bryce
źródło
Próbowałem tego. try_files $ uri.html $ uri / = 404; przerwał ładowanie strony głównej bez nominowania myurl / index również przerwał ładowanie .css, .js itp.
aspirującyGuru