{"id":2713,"date":"2020-05-25T11:08:33","date_gmt":"2020-05-25T09:08:33","guid":{"rendered":"http:\/\/pomocdhosting.dkonto.pl\/?post_type=manual_kb&#038;p=2713"},"modified":"2023-05-18T16:04:47","modified_gmt":"2023-05-18T14:04:47","slug":"modul-mod_rewrite","status":"publish","type":"manual_kb","link":"https:\/\/dhosting.pl\/pomoc\/baza-wiedzy\/modul-mod_rewrite\/","title":{"rendered":"Modu\u0142 mod_rewrite"},"content":{"rendered":"<p>Mod_rewrite to wyspecjalizowany dodatek do serwera WWW umo\u017cliwiaj\u0105cy wykonanie \u201cprzezroczystego\u201d dla u\u017cytkownika przekierowania na inny adres URL.<\/p>\n<p>Posiada wiele zastosowa\u0144, pocz\u0105wszy od prostej zmiany nieaktualnych adres\u00f3w na nowe, a\u017c do zmiany link\u00f3w zawieraj\u0105cych zmienne wysy\u0142ane w standardzie GET na prostsze, dzi\u0119ki czemu s\u0105 one znacznie przyja\u017aniejsze zar\u00f3wno osobom odwiedzaj\u0105cym serwis, jak r\u00f3wnie\u017c i wyszukiwarkom internetowym.<\/p>\n<div id=\"ez-toc-container\" class=\"ez-toc-v2_0_83 ez-toc-wrap-left counter-flat ez-toc-counter ez-toc-custom ez-toc-container-direction\">\n<div class=\"ez-toc-title-container\">\n<p class=\"ez-toc-title\" style=\"cursor:inherit\">Spis tre\u015bci<\/p>\n<span class=\"ez-toc-title-toggle\"><\/span><\/div>\n<nav><ul class='ez-toc-list ez-toc-list-level-1 ' ><li class='ez-toc-page-1'><a class=\"ez-toc-link ez-toc-heading-1\" href=\"https:\/\/dhosting.pl\/pomoc\/baza-wiedzy\/modul-mod_rewrite\/#Wstep_do_przekierowywania_adresow\" >Wst\u0119p do przekierowywania adres\u00f3w<\/a><\/li><li class='ez-toc-page-1'><a class=\"ez-toc-link ez-toc-heading-2\" href=\"https:\/\/dhosting.pl\/pomoc\/baza-wiedzy\/modul-mod_rewrite\/#Proste_przepisywanie_linkow\" >Proste przepisywanie link\u00f3w<\/a><\/li><li class='ez-toc-page-1'><a class=\"ez-toc-link ez-toc-heading-3\" href=\"https:\/\/dhosting.pl\/pomoc\/baza-wiedzy\/modul-mod_rewrite\/#Przekierowania_zaawansowane_uzywajace_wyrazen_regularnych\" >Przekierowania zaawansowane u\u017cywaj\u0105ce wyra\u017ce\u0144 regularnych<\/a><\/li><\/ul><\/nav><\/div>\n<h2><span class=\"ez-toc-section\" id=\"Wstep_do_przekierowywania_adresow\"><\/span>Wst\u0119p do przekierowywania adres\u00f3w<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>Czytelne adresy to podstawa. Dobrze zaprojektowana strona internetowa posiada tak\u017ce logicznie rozplanowan\u0105 struktur\u0119 adres\u00f3w. Zawarte jest w nich cz\u0119sto wiele informacji pozwalaj\u0105cych odwiedzaj\u0105cemu na zapami\u0119tanie z \u0142atwo\u015bci\u0105 pe\u0142nego adresu strony.<\/p>\n<p>Jednak\u017ce wiele system\u00f3w zarz\u0105dzania zawarto\u015bci\u0105 u\u017cywa link\u00f3w wygl\u0105daj\u0105cych podobnie do poni\u017cszego:<\/p>\n<p>http:\/\/www.mojafirma.pl\/sklep.php?kategoria=kapelusze&#038;produkt=123<\/p>\n<p>Nie jest to przyjazny adres, jednak\u017ce programistom dzi\u0119ki standardowym mechanizmom j\u0119zyk\u00f3w skryptowych (PHP, ASP) jest go naj\u0142atwiej zaimplementowa\u0107.<\/p>\n<p>Ponadto wi\u0105\u017ce si\u0119 z nim kilka problem\u00f3w:<\/p>\n<ul>\n<li>Prezentuje wszystkim odwiedzaj\u0105cym budow\u0119 naszego serwisu. Wida\u0107 w nim nazw\u0119 pliku ze skryptem odpowiedzialnym za stron\u0119 i nazwy wszystkich pobieranych zmiennych. Mo\u017ce to stanowi\u0107 furtk\u0119 dla cracker\u00f3w pr\u00f3buj\u0105cych podmieni\u0107 warto\u015bci zmiennych na inne.<\/li>\n<li>W przypadku stosowania przepisywania link\u00f3w zar\u00f3wno struktura plik\u00f3w jak i nazwy poszczeg\u00f3lnych zmiennych s\u0105 przed odwiedzaj\u0105cym ukryte.<br \/>\nW przypadku zmiany technologii wykonania strony zazwyczaj ulegaj\u0105 zmianie adresy URL. Powoduje to chaos w\u015br\u00f3d odwiedzaj\u0105cych kierowanych z innych stron i wyszukiwarek internetowych. W przypadku stosowania mod_rewrite adresy b\u0119d\u0105 wygl\u0105da\u0107 tak samo, niezale\u017cnie od u\u017cytego oprogramowania.<\/li>\n<li>Linki do stron zawieraj\u0105 znaki specjalne, takie jak znak zapytania (?) oraz ampersand (&amp;), przez co w przypadku tworzenia hiper\u0142\u0105czy wymagany jest ich specjalny zapis w formie &amp;<\/li>\n<li>Niekt\u00f3re wyszukiwarki nie indeksuj\u0105 tre\u015bci generowanych dynamicznie. Dzi\u0119ki podmianie link\u00f3w wygl\u0105daj\u0105 one na statyczne strony HTML, kt\u00f3re to s\u0105 analizowane bez problem\u00f3w.<\/li>\n<\/ul>\n<p>U\u017cywaj\u0105c przepisywania link\u00f3w uzyskamy wi\u0119c znacznie prostszy i \u0142atwiejszy do zapami\u0119tania adres.<\/p>\n<p><strong>http:\/\/www.mojafirma.pl\/produkty\/kapelusze\/123\/<\/strong><\/p>\n<p>Jest on znacznie logiczniejszy, czytelniejszy i \u0142atwiejszy do zapami\u0119tania. Ponadto \u017cadna wyszukiwarka nie b\u0119dzie mia\u0142a z nim problem\u00f3w.<\/p>\n<div id=\"dhost-3413339540\" class=\"dhost-inpost dhost-entity-placement\"><a href=\"https:\/\/dhosting.pl\/opieka-stron.html?utm_source=pomoc&utm_medium=artykul&utm_campaign=pomoc\" target=\"_blank\">\r\n\t<img decoding=\"async\" src=\"https:\/\/dhosting.pl\/pomoc\/wp-content\/uploads\/2025\/01\/baner-opieka.png\" alt=\"opieka stron www\">\r\n<\/a>\r\n<br \/>\r\n<br \/><\/div><h2><span class=\"ez-toc-section\" id=\"Proste_przepisywanie_linkow\"><\/span>Proste przepisywanie link\u00f3w<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<h3>Proste przekierowania<\/h3>\n<p>Na pocz\u0105tek zastosujemy bardzo proste przekierowanie. Za\u0142\u00f3\u017cmy, \u017ce zmienili\u015bmy nazw\u0119 pliku z strona.html na nowa_strona.html. Odwiedzaj\u0105cy poprzez link \/strona.html domy\u015blnie ujrzeli by b\u0142\u0105d o kodzie 404 \u2013 nie znaleziono strony. Ustawiaj\u0105c odpowiedni\u0105 regu\u0142\u0119 pozwolimy na korzystanie tak\u017ce ze starego adresu.<\/p>\n<p>W tym celu tworzymy plik .htaccess z nast\u0119puj\u0105c\u0105 tre\u015bci\u0105:<\/p>\n<ul>\n<li>RewriteEngine on<\/li>\n<li>RewriteRule ^strona\\.html$ nowa_strona.html<\/li>\n<\/ul>\n<p>Pierwsza linijka w\u0142\u0105cza modu\u0142 rewrite. W drugiej natomiast informujemy serwer, i\u017c przy pr\u00f3bie dost\u0119pu do pliku strona.html powinna zosta\u0107 wy\u015bwietlona zawarto\u015b\u0107 pliku nowa_strona.html<\/p>\n<p>Wyra\u017cenie dotycz\u0105ce starej strony to najtrudniejsza rzecz w zrozumieniu tej regu\u0142y.<\/p>\n<p>Widzimy w nim trzy znaki specjalne:<\/p>\n<ul>\n<li>Znak ^ oznacza pocz\u0105tek \u015bcie\u017cki do wirtualnego pliku znajduj\u0105cego si\u0119 wewn\u0105trz katalogu w kt\u00f3rym znajduje si\u0119 plik .htaccess<\/li>\n<li>Znak dolara ($), oznacza koniec analizowanej \u015bcie\u017cki wirtualnego pliku.<\/li>\n<li>Uko\u015bnik (\\) znajduj\u0105cy si\u0119 przed kropk\u0105 to specjalny znacznik wyra\u017cenia regularnego, m\u00f3wi\u0105cy, i\u017c nast\u0119pny znak nie jest znakiem specjalnym wyra\u017cenia regularnego, a normalnym znakiem.<\/li>\n<\/ul>\n<p>Po umieszczeniu tego kodu i otworzeniu pliku strona.html uka\u017ce si\u0119 nam zawarto\u015b\u0107 nowa_strona.html. Odwiedzaj\u0105cy nie zauwa\u017cy \u017cadnej r\u00f3\u017cnicy.<\/p>\n<h3>Wymuszenie zmiany adresu<\/h3>\n<p>W opisanym wcze\u015bniej przypadku u\u017cytkownik odwiedzaj\u0105cy stron\u0119 nie zauwa\u017cy zmiany adresu. Mo\u017cliwe jest zastosowanie tzw. przekierowania \u2013 w\u00f3wczas do przegl\u0105darki zostanie wys\u0142any nakaz od\u015bwie\u017cenia adresu w przegl\u0105darce oraz odwiedzenia ju\u017c nowej strony.<\/p>\n<p>W tym celu na ko\u0144cu regu\u0142y zaprezentowanej powy\u017cej nale\u017cy dopisa\u0107 ci\u0105g [R].<\/p>\n<pre class=\"line-numbers\"><code class=\"language-php\" data-line=\"\">RewriteRule ^strona\\.html$ nowa_strona.html [R]<\/code><\/pre>\n<h2><span class=\"ez-toc-section\" id=\"Przekierowania_zaawansowane_uzywajace_wyrazen_regularnych\"><\/span>Przekierowania zaawansowane u\u017cywaj\u0105ce wyra\u017ce\u0144 regularnych<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>Teraz poznamy naprawd\u0119 u\u017cyteczne narz\u0119dzie. To w nim tkwi ca\u0142a pot\u0119ga mod_rewrite.<\/p>\n<p>Je\u015bli to Twoja pierwsza przygoda z wyra\u017ceniami regularnymi, ich zrozumienie mo\u017ce nastr\u0119czy\u0107 na pocz\u0105tku wielu trudno\u015bci. U\u0142atwi\u0105 Ci to przedstawione przyk\u0142ady.<\/p>\n<p>U\u017cywaj\u0105c wyra\u017ce\u0144 regularnych mo\u017cemy automatycznie przepisa\u0107 wiele adres\u00f3w w tym samym momencie.<\/p>\n<pre class=\"line-numbers\"><code class=\"language-php\" data-line=\"\">RewriteRule ^produkty\/([0-9][0-9])\/$ \/informacje.php?ID=$1<\/code><\/pre>\n<p>Powy\u017csza regu\u0142a przechwyci wszystkie adresy rozpoczynaj\u0105ce si\u0119 od ci\u0105gu \u201cprodukty\/12\/\u201d nast\u0119pnie dwie cyfry i znak \u201c\/\u201d. Przyk\u0142adowo \u201cprodukty\/12\/\u201d oraz \u201cprodukty\/99\/\u201d przenios\u0105 nas do naszego skryptu.<\/p>\n<p>Cz\u0119\u015bci w nawiasach kwadratowych to tzw. zakresy. W naszym przypadku s\u0105 to cyfry od 0 do 9. Inne ich przyk\u0142ady to [A-Z] \u2013 wielkie litery, [a-z] \u2013 ma\u0142e litery, [A-Za-z] \u2013 wszystkie litery bez wzgl\u0119du na wielko\u015b\u0107.<\/p>\n<p>Umie\u015bcili\u015bmy wyra\u017cenie regularne w nawiasach, gdy\u017c zamierzamy wszystkie pasuj\u0105ce do danego wzorca warto\u015bci zachowa\u0107 do p\u00f3\u017aniejszego u\u017cycia. W tym przypadku przekazujemy je do skryptu PHP jako argument.<\/p>\n<p>Ka\u017cda para nawias\u00f3w z wyra\u017ceniami umieszczana jest w odpowiedniej zmiennej. Jej nazw\u0105 jest kolejny numer nawiasu poprzedzony znakiem dolara. Przyk\u0142adowo, pierwszy oznaczony fragment b\u0119dzie dost\u0119pny pod $1, trzeci pod $3 itp. Po wywo\u0142aniu adresu \u201cprodukty\/12\/\u201d przegl\u0105darka wy\u015bwietli zawarto\u015b\u0107 strony b\u0119d\u0105cej rzeczywi\u015bcie pod adresem \u201cinformacje.php?id=12\u201c. Oczywi\u015bcie ten adres zostanie ukryty przed odwiedzaj\u0105cym.<\/p>\n<h3>Wielokrotne przekierowania<\/h3>\n<p>Gdy w opisanym we wcze\u015bniejszym przyk\u0142adzie przypadku u\u017cytkownik wpisze adres w postaci \u201cprodukty\/12\u201d (pomijaj\u0105c ko\u0144cowy uko\u015bnik) to serwer zwr\u00f3ci b\u0142\u0105d, gdy\u017c nie posiada regu\u0142 przechwytuj\u0105cych takie zachowania.<\/p>\n<p>Aby temu zapobiec, zastosujemy na pocz\u0105tku regu\u0142\u0119 przekierowuj\u0105c\u0105 wszystkie \u017c\u0105dania bez ko\u0144cowego uko\u015bnika do\u0142\u0105czaj\u0105c go do nowego adresu.<\/p>\n<pre class=\"line-numbers\"><code class=\"language-php\" data-line=\"\">RewriteRule ^produkty\/([0-9][0-9])$ \/produkty\/$1\/ [R]<\/code><\/pre>\n<p>W wielokrotnych przekierowaniach na naszych serwerach istotna jest kolejno\u015b\u0107 regu\u0142, zgodnie z kolejno\u015bci\u0105 linii pliku .htaccess. Podana przez nas regu\u0142a musi by\u0107 dopisana linijk\u0119 przed opisan\u0105 we wcze\u015bniejszym rozdziale.<\/p>\n<p>Ca\u0142o\u015b\u0107 wygl\u0105da nast\u0119puj\u0105co:<\/p>\n<pre class=\"line-numbers\"><code class=\"language-php\" data-line=\"\">RewriteRule ^produkty\/([0-9][0-9])$ \/produkty\/$1\/ [R] \nRewriteRule ^produkty\/([0-9][0-9])\/$ \/informacje.php?ID=$1<\/code><\/pre>\n<p>Gdy u\u017cytkownik odwiedzi adres \u201cprodukty\/21\u201c, to w pierwszej kolejno\u015bci zostanie przekierowany na \u201cprodukty\/21\/\u201c, po czym zostanie mu zaprezentowana zawarto\u015b\u0107 pliku informacje.php?ID=21.<\/p>\n<h3>Modyfikatory<\/h3>\n<p>Obecnie w kodzie regu\u0142y zdefiniowali\u015bmy na sta\u0142e ilo\u015b\u0107 znak\u00f3w wymaganych w linku.<\/p>\n<p>Wywo\u0142anie \u201cprodukty\/1\/\u201d jak r\u00f3wnie\u017c \u201cprodukty\/100\/\u201d zako\u0144czy si\u0119 b\u0142\u0119dem.<\/p>\n<p>Aby nie definiowa\u0107 okre\u015blonej ilo\u015bci znak\u00f3w potrzebnych do regu\u0142y, stosujemy tzw. modyfikatory. Sp\u00f3jrzmy na poni\u017csz\u0105 regu\u0142\u0119:<\/p>\n<pre class=\"line-numbers\"><code class=\"language-php\" data-line=\"\">RewriteRule ^products\/([0-9]+)\/$ \/informacje.php?ID=$1<\/code><\/pre>\n<p>Po zakresie pojawi\u0142 si\u0119 modyfikator \u2013 znak plusa (+). Oznacza on, i\u017c wymagany jest co najmniej jeden znak z danego zakresu. W tym przypadku pasowa\u0107 b\u0119dzie do niego zar\u00f3wno \u201cprodukty\/1\/\u201d jak i \u201cprodukty\/1000\/\u201d<\/p>\n<p>Innymi modyfikatorami s\u0105: gwiazdka (oznaczaj\u0105ca zero lub wi\u0119cej element\u00f3w zakresu) i znak zapytania (zero lub jeden znak z zakresu)<\/p>\n<h3>Tworzenie skr\u00f3t\u00f3w adres\u00f3w<\/h3>\n<p>Dzi\u0119ki wykorzystaniu mod_rewrite mo\u017cemy utworzy\u0107 \u201cskr\u00f3ty\u201d do cz\u0119sto u\u017cywanych obszar\u00f3w stron WWW.<\/p>\n<p>Zak\u0142adamy, i\u017c wi\u0119kszo\u015b\u0107 odwiedzaj\u0105cych stron\u0119 sklepu z odzie\u017c\u0105 z zamiarem kupienia spodni wpisze do przegl\u0105darki:<\/p>\n<p>www.firma.pl\/spodnie<\/p>\n<p>Jednak\u017ce oprogramowanie naszego sklepu wymaga link\u00f3w w postaci:<\/p>\n<p>www.firma.pl\/odziez\/spodnie<\/p>\n<p>Korzystaj\u0105c z poni\u017cszej regu\u0142y:<\/p>\n<pre class=\"line-numbers\"><code class=\"language-php\" data-line=\"\">RewriteRule ^spodnie(\/)?$ \/odziez\/spodnie\/ [R]<\/code><\/pre>\n<p>Wymusimy na odwiedzaj\u0105cych przekierowanie do nowego adresu.<\/p>\n","protected":false},"author":6,"featured_media":10957,"parent":0,"menu_order":0,"template":"","format":"standard","manualknowledgebasecat":[95,109],"manual_kb_tag":[655,232,1202,1204,3517,234,1203,3516],"class_list":["post-2713","manual_kb","type-manual_kb","status-publish","format-standard","has-post-thumbnail","hentry","manualknowledgebasecat-hosting","manualknowledgebasecat-strony-www","manual_kb_tag-hosting","manual_kb_tag-htaccess","manual_kb_tag-mod_rewrite","manual_kb_tag-nice-url","manual_kb_tag-polski-hosting","manual_kb_tag-przekierowania","manual_kb_tag-reguly-pliku-htaccess","manual_kb_tag-web-hosting"],"_links":{"self":[{"href":"https:\/\/dhosting.pl\/pomoc\/wp-json\/wp\/v2\/manual_kb\/2713","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/dhosting.pl\/pomoc\/wp-json\/wp\/v2\/manual_kb"}],"about":[{"href":"https:\/\/dhosting.pl\/pomoc\/wp-json\/wp\/v2\/types\/manual_kb"}],"author":[{"embeddable":true,"href":"https:\/\/dhosting.pl\/pomoc\/wp-json\/wp\/v2\/users\/6"}],"version-history":[{"count":0,"href":"https:\/\/dhosting.pl\/pomoc\/wp-json\/wp\/v2\/manual_kb\/2713\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/dhosting.pl\/pomoc\/wp-json\/wp\/v2\/media\/10957"}],"wp:attachment":[{"href":"https:\/\/dhosting.pl\/pomoc\/wp-json\/wp\/v2\/media?parent=2713"}],"wp:term":[{"taxonomy":"manualknowledgebasecat","embeddable":true,"href":"https:\/\/dhosting.pl\/pomoc\/wp-json\/wp\/v2\/manualknowledgebasecat?post=2713"},{"taxonomy":"manual_kb_tag","embeddable":true,"href":"https:\/\/dhosting.pl\/pomoc\/wp-json\/wp\/v2\/manual_kb_tag?post=2713"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}