Spraw, aby Nginx zawsze wyświetlał indeks

2

Jak mogę sprawić, aby nginx zawsze wyświetlał plik index.html bez względu na adres URL?

Na przykład chcę, aby adres URL https://www.example.me/723738zawsze wyświetlał sięhttps://www.example.me/index.html

Nie chcę używać przekierowania, ponieważ użytkownik musi nadal mieć oryginalny adres URL wpisany w pasku adresu.

Zmieniam konfigurację Nginx, aby przekierować 404 na index.html, ale nie sądzę, że to świetny sposób na to, ponieważ zwróci odpowiedź 404.

W przyszłości mogę chcieć, aby index.html wyświetlał oryginalny adres URL, do którego użytkownik uzyskał dostęp, czy jest na to sposób?

Dzięki

Cherona
źródło

Odpowiedzi:

1

Odpowiedź na pytanie 1:

Funkcja, której szukasz, nazywa się przepisywaniem adresów URL. Umożliwia to tworzenie masek (lub „fałszywych” adresów URL), które pokazują zasoby znajdujące się pod innym adresem URL.

W Nginx jest to osiągane przez rewrite <regexp-pattern> <target-url>polecenie w pliku konfiguracyjnym. Oto konfiguracja Nginx dla domeny www.example.com:

server {
    listen 80;
    server_name www.example.com;

    root /var/www/example.com;
    index index.html;

    rewrite ^.*$ /index.html;
}

Część <regexp-pattern>(REGULARNA EKSPRESJA) jest porównywana z adresem URL wpisanym w przeglądarce - jeśli dopasowanie się powiedzie, <target-url>wyświetlony zostanie zasób o .

Odpowiedź na pytanie 2:

Bieżącego adresu URL nie można wyświetlić tylko w czystym dokumencie HTML. Musisz użyć języka skryptowego po stronie serwera - na przykład PHP. Umożliwi to wyświetlanie dynamicznej treści użytkownikowi. Istnieje niewyczerpana oferta przewodników po PHP z Nginx ( https://askubuntu.com/a/134676 ) oraz na temat sposobu wyświetlania bieżącego adresu URL z PHP ( https://stackoverflow.com/a/6768831 ).

Marek Rost
źródło
6

Wspólny wzorzec używa try_filesz domyślnym identyfikatorem URI. Na przykład minimalistyczny:

server {
    root /path/to/root;
    location / {
        try_files $uri $uri/ /index.html;
    }
}

Więcej informacji znajduje się w tym dokumencie .

Richard Smith
źródło
Jest to wyraźnie prostsze (z drugiej strony nie maskuje innych istniejących plików w katalogu).
Marek Rost
2
To prawda, ale zwykle są to pliki zasobów, które należy pobrać, index.htmldlatego najpierw przedstawiłem wspólne rozwiązanie.
Richard Smith
Co jeśli chcę, aby istniejące pliki również zostały przepisane / przekierowane do /index.html?
Qian Chen,
1
@ElgsQianChen użyj try_files /index.html =404;lub rewrite ^ /index.html break;. Ale bez innych zmian spowoduje to przerwanie dostępu do plików zasobów (JS. CSS, IMG).
Richard Smith
Jest to w rzeczywistości lepsze rozwiązanie pytania PO, tylko dlatego, że zasoby zostały poprawnie załadowane odpowiednim typem MIME.
gumol
0

To jest kod, którego szukasz

server {
listen 80 default_server;
listen [::]:80 default_server;
server_name _;
root /var/www/;
index index.html;

location = /favicon.ico { access_log off; log_not_found off; }

error_page 404 =200 /;
}

Z nazwa_serwera _; słucha z dowolnego adresu IP, domeny.

Mike Brian Olivera
źródło