Nginx

Jak korzystać z przepisywania adresów URL

Jak korzystać z przepisywania adresów URL
Przepisywanie adresu URL to proces zmiany adresu URL żądania na inny, zgodnie z definicją na serwerze sieciowym. Nginx używa modułu ngx_http_rewrite_module, który głównie używa dyrektyw return, rewrite do celów przepisywania. Poza dyrektywami zdefiniowanymi w tym module, dyrektywa map, zdefiniowana w ngx_http_map_module, może być również używana do łatwego przepisywania adresów URL. Ten przewodnik ma na celu wyjaśnienie 2 głównych dyrektyw - return, rewrite i ich flag, sposobu ich działania i ich zastosowań.

Warunki wstępne

Ten przewodnik jest zoptymalizowany dla Nginx 1.0.1 i nowszych, dlatego zdecydowanie zaleca się aktualizację istniejącej instancji Nginx do wyżej wymienionej lub wyższej wersji. Jednak niektóre polecenia, składnie mogą nadal działać dla dowolnej wersji przed wspomnianą wersją. Ponieważ ten przewodnik dotyczy przepisywania adresów URL, co jest tematem nieco zaawansowanym, zakłada się, że odbiorcy są świadomi procedury instalacji Nginx, dlatego nie jest to tutaj wyjaśnione.

Powrót

Return to podstawowa dyrektywa, która wykonuje przepisywanie adresów URL i jest łatwa do zrozumienia. Nie używa wyrażeń regularnych, ale może zawierać zmienne do przeanalizowania, przechwycone ze ścieżki bloku lokalizacji. Zwykle dyrektywa return służy do przekierowania adresu URL żądania do innej lokalizacji, dlatego często używa kodów HTTP, takich jak 301 dla stałego przekierowania i 302 dla tymczasowego przekierowania. Poniższe fragmenty kodu demonstrują niektóre przypadki użycia dyrektywy return.

Poniższy fragment kodu przekierowuje adres URL żądania do Google.com. Może być używany bezpośrednio pod blokiem kodu serwera lub pod blokiem kodu lokalizacji, ale upewnij się, że nie przekierowujesz do tej samej domeny, aby uniknąć pętli przekierowań

powrót 301 https://google.pl;

Poniższy fragment kodu przekierowuje adres URL żądania do Nucuta.com wraz ze ścieżką, np. powyższy przykład nie zawiera żadnej ścieżki, parametrów, a co za tym idzie bez względu na to, który adres URL zostanie wpisany w pasku adresu, żądanie jest przekierowywane do domeny głównej Google, podczas gdy w poniższym przykładzie, ścieżka wraz z parametrami są przenoszone bez nazwy domeny. Alternatywnie można użyć $is_args$args, ale zamiast $request_uri należy użyć zmiennej $uri, ponieważ $request_uri zawiera również parametry adresu URL. Jeśli wymagane jest przekierowanie do innego katalogu tej samej domeny, należy użyć zmiennej $host zamiast nazwy domeny w dyrektywie return, na przykład w poniższym przykładzie zamiast nucuta.com, użyj $host.

powrót 301 https://nucuta.com$request_uri;

Poniższy fragment kodu przekierowuje przychodzące żądanie do katalogu ścieżki tej samej domeny i schematu, co oznacza, że ​​poniższy fragment kodu jest używany w http://Linux.com, a jeśli odwiedzający wysłał do niego żądanie, jest on przekierowywany do katalogu ze ścieżką, dlatego poniższy fragment kodu jest przydatny w przypadku zarządzania dużą liczbą witryn internetowych. Tutaj $scheme definiuje protokół adresu URL, taki jak FTP, HTTP, HTTPS, a $host definiuje bieżącą domenę serwera z rozszerzeniem domeny, takim jak Google.pl, Linux.Netto itp. Ponieważ nie wykonuje to żadnego przekierowania protokołu, takiego jak z HTTP na HTTPs, należy to zrobić ręcznie, jak w drugim przykładzie.

return 301 $schemat://$host/ścieżka;
jeśli ($schemat != "https")
zwróć 301 https://$host$request_uri;

Innym użytecznym przypadkiem użycia dyrektywy return jest możliwość włączenia zmiennych regex, ale w tym celu wyrażenie regularne powinno być określone w bloku lokalizacji i powinno przechwycić wzorzec, a następnie przechwycony wzorzec można połączyć z istniejącym adresem URL w dyrektywie return w celu przekierowania, na przykład w poniższym przykładzie, gdy zostanie wysłane żądanie dostępu do pliku tekstowego, przechwytuje nazwę pliku tekstowego w bloku lokalizacji, następnie przekazuje tę nazwę do dyrektywy return, a następnie dyrektywa return łączy ją z istniejącą URL do przekierowania żądania do innego katalogu.

lokalizacja ~* ^/([^/]+.txt) $
zwróć 301 /chrom/$1;

Przepisać

Rewrite to dyrektywa służąca do wewnętrznego przepisywania adresów URL na serwerze sieciowym bez ujawniania mechanizmu bazowego po stronie klienta. Zgodnie ze składnią jest używany z wyrażeniami regularnymi. Podstawowa składnia wygląda następująco. Symbol zastępczy regex służy do używania wyrażeń regularnych, zastępczy symbol zastępczy służy do zastępowania dopasowanego adresu URL, podczas gdy flaga służy do manipulowania przepływem wykonania. W tej chwili flagi używane w dyrektywie rewrite to break, permanent, redirect i last.

przepisać zastąpienie wyrażenia regularnego [flaga];

Przed przejściem do wyrażeń regularnych, zamienników, przechwytywania wzorców i zmiennych, ważne jest, aby wiedzieć, w jaki sposób flagi powodują zachowanie wewnętrznego silnika Nginx. Istnieją cztery główne flagi używane z dyrektywą rewrite, jak wyjaśniono wcześniej, a wśród nich stałe, flagi przekierowania mogą być sparowane, ponieważ obie wykonują tę samą funkcjonalność, co oznacza przekierowanie.

Przeadresować

Flaga przekierowania służy do sygnalizowania przeglądarce, że przekierowanie jest tymczasowe, co jest również pomocne w przypadku robotów wyszukiwarek, aby rozpoznać, że strona została tymczasowo przeniesiona i zostanie przywrócona w pierwotnej lokalizacji jakiś czas później. Gdy strona sygnalizuje, że jest to 302, wyszukiwarki nie wprowadzają żadnych zmian w jej indeksowaniu, a zatem odwiedzający nadal widzą oryginalną stronę w indeksie wyszukiwarki podczas wyszukiwania, co oznacza, że ​​stara strona nie jest usuwana, a ponadto wszystkie wartościowe , takie jak pozycja strony, sok linków nie są przekazywane do nowej strony.

Lokalizacja /

przepisać ^ http://155.138.XXX.Przekierowanie XXX/ścieżkę;

Stały

Flaga permanentna służy do sygnalizowania przeglądarce, że przekierowanie jest trwałe, co jest również pomocne w przypadku robotów wyszukiwarek, aby rozpoznać, że strona została trwale przeniesiona i NIE zostanie przywrócona w pierwotnej lokalizacji jakiś czas później, jak w przypadku tymczasowego przeniesienia. Gdy strona sygnalizuje, że jest to 301, wyszukiwarki dokonują pewnych zmian w jej indeksowaniu, a zatem odwiedzający widzą nową stronę w indeksie wyszukiwarki zamiast starej strony podczas wyszukiwania, co oznacza, że ​​stara strona jest zastępowana nową. jakościowe, takie jak pozycja strony, sok linków są przekazywane do nowej strony.

Lokalizacja /

przepisać ^ http://155.138.XXX.XXX/ścieżka stała;

Wyrażenie regularne, przechwytywanie wzorców i zmienne.

Nginx intensywnie używa wyrażeń regularnych z dyrektywą rewrite, a zatem wiedza o wyrażeniach regularnych przydaje się w tym segmencie.  Istnieje wiele typów wyrażeń regularnych, ale Nginx używa wyrażeń regularnych zgodnych z Perl, czyli PCRE. Posiadanie narzędzia do testowania wyrażeń regularnych jest przydatne, aby upewnić się, że napisany wzorzec rzeczywiście działa, zanim użyjesz go w pliku konfiguracyjnym Nginx. Ten przewodnik poleca https://regex101.com/ jako narzędzie, a wszystkie poniższe przykłady są dokładnie testowane za pomocą wspomnianego narzędzia tool.

Wyrażenia regularne

przepisz ^/fr/(.*)$ http://nucuta.com/1 USD na stałe;

Typowy wzorzec dyrektywy rewrite jest taki jak powyżej, zawiera dyrektywę rewrite na początku, następnie spacją „wzór” w wyrażeniu regularnym, następnie spacją „zamiennik”, a na końcu „flagę”. Dyrektywę rewrite można umieścić w dowolnym miejscu w nawiasach serwerowych, ale zaleca się zachowanie jej po określeniu dyrektyw listen, server_name, root i index. Gdy odwiedzający zgłasza żądanie do serwera, wraz z żądaniem wysyłany jest adres URL, a jeśli adres URL jest dopasowany do wzorca wyrażenia regularnego określonego w dyrektywie rewrite, jest on przepisany na podstawie zamiany, a następnie przepływ wykonania jest manipulowany na podstawie na fladze.

Wzorzec wyrażenia regularnego używa nawiasów do wskazania grupy, której podciąg jest wyodrębniany z adresu URL po dopasowaniu wzorca wyrażenia regularnego do adresu URL żądania, a następnie ten podciąg pobrany z adresu URL jest przypisywany do zmiennej w „zastąpienie” dyrektywy przepisywania. Jeśli istnieje wiele dopasowanych grup, podciąg każdej dopasowanej grupy jest przypisywany do zmiennych w „zastępowaniu” w kolejności numerycznej, co oznacza, że ​​podciąg pierwszej dopasowanej grupy jest przypisywany do pierwszej zmiennej ($1), podciąg druga dopasowana grupa jest przypisywana do drugiej zmiennej ($2) i tak dalej.

Spośród 4 flag 2 flagi zostały już wyjaśnione w tym przewodniku, pozostałe są ostatnie i pękają. Zanim zrozumiesz, jak działają pozostałe flagi, ważne jest, aby zrozumieć, jak zachowuje się silnik Nginx z dyrektywami rewrite. Gdy adres URL jest wysyłany wraz z żądaniem, silnik Nginx próbuje dopasować go do bloku lokalizacji. Niezależnie od tego, czy jest dopasowany, czy nie, jeśli natknie się na dyrektywę, taką jak rewrite, return, jest ona wykonywana sekwencyjnie. Jeśli wysłany adres URL jest dopasowany do wzorca dyrektywy przepisywania, silnik Nginx wykonuje cały plik konfiguracyjny, niezależnie od tego, gdzie dyrektywa przepisywania jest określona jako pętla, dopóki nowo przepisany adres URL nie pasuje do jednego z bloków lokalizacji.

Poniższy adres URL jest używany jako demonstracja wyjaśniająca, w jaki sposób obie flagi sprawiają, że przepływ wykonania silnika Nginx zachowuje się z dyrektywą rewrite. Poniższy zrzut ekranu przedstawia strukturę plików serwera WWW.

http://155.138.XXX.XXX/przeglądarka/próbka.txt (adres URL wysłany jako żądanie)

Gdy nie jest używana flaga

Gdy żadna flaga nie jest używana, obie dyrektywy rewrite są wykonywane sekwencyjnie; stąd pierwszy adres URL na poniższej liście zamienia się w 2znaleźć, wtedy 2znaleźć URL zmienia się w ostatni URL Więc kiedy próbka.plik txt w folderze przeglądarki jest wymagany, serwer WWW faktycznie obsługuje próbkę.plik txt w folderze głównym. Ponieważ przepisywanie adresu URL jest całkowicie oderwane od przeglądarki, nie widać żadnej różnicy w udostępnianiu w porównaniu z dyrektywą return, która określa przeglądarkę, czy żądanie zostało przekierowane, czy nie, za pomocą numeru HTTP.

  1. http://155.138.XXX.XXX/przeglądarka/próbka.tekst
  2. http://155.138.XXX.XXX/chrom/próbka.tekst
  3. http://155.138.XXX.XXX/próbka.tekst
Lokalizacja /

przepisz ^/przeglądarka/(.*)$ /chrom/1$;
przepisz ^/chrom/(.*)$ /$1;
lokalizacja /chrome
try_files $uri $uri/ =404;

Gdy określono przerwanie lub ostatnią flagę poza blokiem lokalizacji

Gdy flaga break lub last jest określona poza blokiem lokalizacji, dyrektywy rewrite po dopasowanej dyrektywie rewrite nie są w ogóle analizowane, na przykład w poniższym przykładzie adres URL żądania jest przepisany na 2znaleźć jeden z poniższej listy, niezależnie od używanej flagi, i to wszystko.

  1. http://155.138.XXX.XXX/przeglądarka/próbka.tekst
  2. http://155.138.XXX.XXX/chrom/próbka.tekst
Lokalizacja /

przepisz ^/przeglądarka/(.*)$ /chrome/1$ ostatni;#break
przepisz ^/chrom/(.*)$ /$1 ostatni;#przerwa
lokalizacja /chrome
try_files $uri $uri/ =404;

Kiedy ostatnia flaga jest używana wewnątrz bloku lokalizacji

Kiedy ostatnia flaga jest używana w bloku lokalizacji, przestaje analizować już dyrektywy ponownego zapisywania wewnątrz tego konkretnego bloku lokalizacji i pogrąża się w następnym bloku przepisywania lokalizacji, jeśli przepisany adres URL jest dopasowany do ścieżki tego bloku lokalizacji, a następnie wykonuje kolejna dyrektywa przepisywania wewnątrz niego.

  1. http://155.138.XXX.XXX/przeglądarka/próbka.tekst
  2. http://155.138.XXX.XXX/chrom/próbka.tekst
  3. http://155.138.XXX.XXX/próbka.tekst
Lokalizacja /
przepisz ^/przeglądarka/(.*)$ /chrom/1$ ostatni;

lokalizacja /chrome
przepisz ^/chrom/(.*)$ /$1 ostatni;
try_files $uri $uri/ =404;

Gdy flaga przerwania jest używana wewnątrz bloku lokalizacji

Z drugiej strony, flaga przerwania, gdy znajduje się w bloku lokalizacji, przestań analizować dalsze dyrektywy przepisywania, niezależnie od tego, gdzie się znajdują, gdy jedna dyrektywa przepisywania jest dopasowana do adresu URL żądania i udostępnia zawartość użytkownikowi.

Lokalizacja /
przepisz ^/przeglądarka/(.*)$ /chrome/1$ przerwa;

lokalizacja /chrome
przepisz ^/chrom/(.*)$ /$1 przerwa;
try_files $uri $uri/ =404;

Wniosek

Przepisywanie adresów URL to proces przepisywania adresów URL na serwerze WWW. Nginx zapewnia wiele dyrektyw, takich jak return, rewrite, map, aby było to możliwe. Ten przewodnik pokazuje, czym są dyrektywy return i rewrite oraz w jaki sposób są one używane do łatwego przepisywania adresów URL. Jak pokazano na przykładach, dyrektywa return jest odpowiednia do sygnalizowania przeglądarce, a robot indeksujący wyszukiwarkę informacji o miejscu pobytu strony, podczas gdy dyrektywa rewrite jest przydatna w abstrahowaniu procesu przepisywania adresu URL bez informowania przeglądarki o tym, co dzieje się za kulisami. Jest to bardzo przydatne przy udostępnianiu treści przez CDN, serwer buforowany lub z innej lokalizacji w sieci. Użytkownicy nigdy nie wiedzą, skąd pochodzi zasób, ponieważ przeglądarka pokazuje tylko podany im adres URL.

Gry How to download and Play Sid Meier's Civilization VI on Linux
How to download and Play Sid Meier's Civilization VI on Linux
Introduction to the game Civilization 6 is a modern take on the classic concept introduced in the series of the Age of Empires games. The idea was fai...
Gry How to Install and Play Doom on Linux
How to Install and Play Doom on Linux
Introduction to Doom The Doom Series originated in the 90s after the release of the original Doom. It was an instant hit and from that time onwards th...
Gry Vulkan for Linux Users
Vulkan for Linux Users
With each new generation of graphics cards, we see game developers push the limits of graphical fidelity and come one step closer to photorealism. But...