
🚀 Jak usunąć index.php i index.html z URL: 301 redirect do katalogu głównego witryny
Otwiera Pan Google Search Console i widzi: strona główna jest zindeksowana podwójnie, jako site.ru/ i jako site.ru/index.php. Albo site.ru/index.html. Dla wyszukiwarki to dwa różne adresy URL z identyczną treścią. Rezultat: waga strony jest dzielona na pół między duplikaty, pozycje spadają, budżet indeksowania jest marnowany.
Problem jest stary jak internet. Mechanika jest prosta: serwer domyślnie zwraca index.html lub index.php przy żądaniu katalogu głównego za pomocą dyrektywy DirectoryIndex, ale nie zabrania bezpośredniego dostępu do site.ru/index.php. Z punktu widzenia Apache oba adresy są prawidłowe. Natomiast wyszukiwarka widzi dwie różne strony z identyczną treścią i zaczyna zgadywać, którą z nich pozycjonować.
Poniżej trzy sposoby skonfigurowania przekierowania 301 z plików index na katalog główny: od uniwersalnego .htaccess po Cloudflare i Nginx. Plus sposób weryfikacji, który zajmuje dwie minuty.
💡 Szybki przegląd:
- Proszę dodać reguły
mod_rewritew.htaccess, aby przechwytywać żądania doindex.htmliindex.php - Dla WordPressa i CMS-ów proszę użyć przekierowania PHP w głównym
index.php, przetrwa ono aktualizację bezpośrednich odnośników - Proszę sprawdzić wynik przez
curl -Ilubredirectchecker.com, odpowiedź musi być301 Moved Permanently - Proszę przejrzeć wewnętrzne linki witryny i zastąpić
/index.phpna/w menu, logo i widgetach
Dlaczego duplikaty plików index szkodzą witrynie
Gdy odwiedzający wpisuje site.ru w pasku adresu, Apache po cichu podstawia index.html lub index.php zgodnie z DirectoryIndex. Przeglądarka pokazuje stronę, adres pozostaje czysty, użytkownik nie zauważa podmiany.
Ale jeśli w zewnętrznym świecie istnieje już link do pełnej ścieżki site.ru/index.php, robot wyszukiwarki przychodzi po niego, widzi tę samą treść co na site.ru/ i rejestruje duplikat. Skąd bierze się taki link? Możliwości jest mnóstwo: stara publikacja na zewnętrznej stronie, partner podał nieprawidłowy URL, wtyczka przycisków społecznościowych wygenerowała link z index.php na końcu, a także sam programista na etapie kodowania wstawił href="/index.html" w nawigacji.
Co otrzymujemy w praktyce:
- Rozdzielenie mocy linków. Linki zwrotne są rozdzielane między
/i/index.php, zamiast sumować się na jednej kanonicznej stronie. - Nadmierne zużycie budżetu indeksowania. Robot traci czas na obchodzenie duplikatów zamiast wartościowych sekcji witryny.
- Rozmyta relewantność. Wyszukiwarka nie rozumie, którą z dwóch stron pokazać w wynikach, i może je zmieniać, statystyki zachowań użytkowników są zaburzone, a pozycje niestabilne.
Sytuacja jest w pełni kontrolowana. Rozwiązuje się ją przez skonfigurowanie stałego przekierowania 301 z index.html i index.php na katalog główny /. Przeanalizujmy dostępne sposoby.
Sposób 1: Przekierowanie przez.htaccess na Apache
Plik .htaccess znajduje się w katalogu głównym witryny. Jeśli go nie ma, proszę utworzyć plik tekstowy z kropką na początku nazwy, każdy klient FTP lub menedżer plików hostingu sobie z tym poradzi.
Proszę otworzyć .htaccess i znaleźć wiersz RewriteEngine On. Jeśli go nie ma, proszę dodać jako pierwszą linię po komentarzach. Włącza ona moduł mod_rewrite, który odpowiada za wszystkie przekierowania.
Poniżej RewriteEngine On proszę dodać reguły. Oto minimalny działający zestaw:
1 RewriteEngine On 2 3 RewriteCond %{THE_REQUEST} ^[A-Z]{3,9}\ /index\.php\ HTTP/ 4 RewriteRule ^index\.php$ https://%{HTTP_HOST}/ [R=301,L] 5 6 RewriteCond %{THE_REQUEST} ^[A-Z]{3,9}\ /index\.html\ HTTP/ 7 RewriteRule ^index\.html$ https://%{HTTP_HOST}/ [R=301,L]
Jak to działa linia po linii:
RewriteCond %{THE_REQUEST}sprawdza oryginalny ciąg żądania wysłany przez przeglądarkę do serwera. Jawnie zawiera on/index.phplub/index.html, dokładnie to, co przechwytujemy.RewriteRuleprzekierowuje żądanie na katalog główny domeny z kodem301(stałe przekierowanie). FlagaL(last) zatrzymuje dalsze przetwarzanie reguł.%{HTTP_HOST}automatycznie podstawia domenę witryny, nie trzeba wpisywać jej ręcznie. Protokół jest jawnie wskazany jakohttps://.
Krytyczny niuans: proszę nie używać uproszczonej konstrukcji Redirect 301 /index.php /. Dyrektywa Redirect modułu mod_alias zapętla się na plikach index. Po przekierowaniu na / Apache ponownie podstawia index.php przez DirectoryIndex, reguła uruchamia się ponownie i przeglądarka wyświetla błąd nieskończonej pętli. Połączenie RewriteCond + RewriteRule przez mod_rewrite analizuje właśnie oryginalne żądanie (%{THE_REQUEST}), a nie przepisane przez wewnętrzne reguły, więc zapętlenie nie występuje.
Zmiany w .htaccess wchodzą w życie natychmiast, Apache odczytuje plik przy każdym żądaniu, restart serwera nie jest potrzebny.
Sposób 2: Przekierowanie PHP dla WordPressa i CMS-ów
Na stronach zarządzanych przez WordPress, Joomla, Drupal i inne CMS-y edytowanie .htaccess jest ryzykowne: CMS nadpisuje go podczas aktualizacji bezpośrednich odnośników, zmian struktury URL lub aktywacji wtyczek SEO. Reguły mogą zniknąć przy następnym zapisaniu ustawień.
Dla WordPressa istnieje bardziej stabilny sposób, przekierowanie bezpośrednio w głównym pliku index.php. Znajduje się on w katalogu głównym instalacji CMS i jest wykonywany przy każdym żądaniu, przed załadowaniem rdzenia.
Proszę otworzyć index.php WordPressa i dodać na samym początku, zaraz po otwierającym tagu <?php:
1 <?php 2 // 301 редирект с index.php на корень 3 if ($_SERVER['REQUEST_URI'] === '/index.php') { 4 header('Location: /', true, 301); 5 exit(); 6 } 7 8 // Далее стандартный код WordPress 9 define('WP_USE_THEMES', true); 10 // ...
Dla stron na czystym PHP bez CMS-a logika jest taka sama, proszę umieścić kod w głównym index.php w katalogu publicznym. Jeśli na stronie używane są oba pliki indeksowe (index.php i index.html), proszę dodać analogiczne sprawdzenie dla index.html na początek tego samego skryptu.
Dlaczego ten sposób jest bardziej niezawodny niż edycja .htaccess dla CMS-ów:
- Kod znajduje się wewnątrz pliku PHP, którego CMS nie rusza podczas aktualizacji ustawień bezpośrednich odnośników.
- Sprawdzenie
$_SERVER['REQUEST_URI']przechwytuje dokładnie żądany URL, a nie przepisany przez wewnętrzne reguły WordPressa. exit()gwarantuje przerwanie wykonania, żadna linia poniżej nie zostanie wykonana.
W projektach o dużym obciążeniu przekierowanie PHP jest nieco szybsze niż wariant .htaccess: nie uruchamia się mod_rewrite do analizy wyrażeń regularnych, oszczędzając milisekundy przy każdym żądaniu.
Sposób 3: Cloudflare, Nginx i inne serwery
Cloudflare. Jeśli witryna działa przez Cloudflare, przekierowanie można wykonać na poziomie CDN, w ogóle nie dotykając plików serwera. Proszę wejść do sekcji Rules → Redirect Rules, utworzyć regułę:
- Pole:
URI Path - Operator:
equals - Wartość:
/index.php - URL przekierowania:
https://yourdomain.com/ - Kod statusu:
301
Analogiczną regułę proszę dodać dla /index.html. Plus podejścia: przekierowanie działa na serwerach brzegowych Cloudflare, żądanie nawet nie dociera do Państwa hostingu. Minus: domena musi być delegowana na NS Cloudflare.
Nginx. Witryny na Nginx nie używają .htaccess. Reguły wprowadza się do pliku konfiguracyjnego serwera, zazwyczaj /etc/nginx/sites-available/yourdomain:
1 location = /index.php { 2 return 301 https://yourdomain.com/; 3 } 4 5 location = /index.html { 6 return 301 https://yourdomain.com/; 7 }
Po edycji proszę sprawdzić składnię poleceniem nginx -t i zastosować zmiany: systemctl reload nginx.
LiteSpeed / OpenLiteSpeed. Serwer obsługuje .htaccess z tymi samymi regułami mod_rewrite co Apache, sposób 1 działa bez zmian. Dodatkowo można użyć wbudowanego mechanizmu przekierowań w panelu sterowania LiteSpeed WebAdmin.
IIS (Windows Server). Dla witryn na IIS przekierowanie konfiguruje się przez moduł URL Rewrite w web.config:
1 <rule name="Redirect index.php to root" stopProcessing="true"> 2 <match url="^index\.php$" /> 3 <action type="Redirect" url="/" redirectType="Permanent" /> 4 </rule>
Proszę dodać analogiczną regułę dla index.html.
Jak sprawdzić, czy przekierowanie działa
Najbardziej niezawodny sposób, wiersz poleceń. Proszę wykonać:
1 curl -I https://yourdomain.com/index.php
Pierwsza linia odpowiedzi musi być HTTP/1.1 301 Moved Permanently, a w nagłówku Location katalog główny witryny. Proszę powtórzyć dla index.html. Strona główna pod katalogiem / musi odpowiadać kodem 200.
Alternatywne narzędzia do sprawdzenia:
- Redirect Checker (redirectchecker.com), pokazuje pełny łańcuch przekierowań z kodami odpowiedzi, wygodny do szybkiej diagnostyki bez terminala.
- Google Search Console → Sprawdzanie URL, narzędzie do wklejania i sprawdzania: pokazuje, jak Googlebot widzi stronę po przekierowaniu i czy jest ona dostępna do indeksowania.
Po skonfigurowaniu przekierowania krytycznie ważne jest sprawdzenie wewnętrznych linków witryny. Proszę upewnić się, że menu, logo (zazwyczaj linkuje do strony głównej), breadcrumbs i bloki podobnych wpisów wskazują na /, a nie na /index.php. Jeden nieprawidłowy link wewnętrzny może odtworzyć duplikat, który właśnie Pan usunął. Proszę przejrzeć witrynę, szukając w kodzie źródłowym: otworzyć dowolną stronę, nacisnąć Ctrl+U i wyszukać href="/index.php" lub href="/index.html". Każde takie wystąpienie proszę zastąpić przez href="/".
Wideo: krótkie wyjaśnienie przekierowań 301 od Google
Czterominutowe wideo od Google Search Central, obowiązkowe do obejrzenia, jeśli konfiguruje Pan przekierowania po raz pierwszy. John Mueller wyjaśnia, jak wyszukiwarka przetwarza stałe przekierowania i czy istnieją ograniczenia co do ich liczby:
⁉️🤔 Często zadawane pytania
Co się stanie, jeśli w ogóle nie skonfiguruję przekierowania z index.php?
Wyszukiwarka sama wybierze wersję kanoniczną, ale niekoniecznie tę, której Pan potrzebuje. Część mocy linków trafi do duplikatu, a w wynikach mogą występować naprzemiennie oba adresy URL. Nie ma bezpośredniego zagrożenia sankcjami, ale pozycje będą niższe, niż mogłyby być przy czystej strukturze. John Mueller z Google wielokrotnie podkreślał: kanonikalizacja przez
rel="canonical"to podpowiedź dla wyszukiwarki, a nie dyrektywa. Google ma prawo zignorować canonical i wybrać inną stronę, jeśli uzna ją za bardziej relewantną. Przekierowanie 301 to dyrektywa: gwarantuje przekazanie wagi i wyklucza duplikat z indeksu.
Czy można użyć Redirect 301 /index.php / zamiast mod_rewrite?
Technicznie tak, ale dla plików index jest to niebezpieczne. Po przekierowaniu na
/Apache ponownie podstawiindex.phpprzezDirectoryIndex, regułaRedirecturuchomi się ponownie, powstanie nieskończona pętla, przeglądarka przerwie ją błędemERR_TOO_MANY_REDIRECTS.RewriteCondze sprawdzeniem%{THE_REQUEST}jest pozbawiony tego problemu: analizuje oryginalne żądanie od przeglądarki, a nie przepisane przez wewnętrzne reguły serwera.
Czy trzeba konfigurować przekierowanie, jeśli witryna działa tylko przez HTTPS?
Tak. HTTPS i duplikaty index to dwa niezależne problemy. Nawet przy skonfigurowanym przekierowaniu HTTP→HTTPS i poprawnym
rel="canonical"bezpośrednie żądaniehttps://site.ru/index.phpzwróci kod 200 bez przekierowania. Reguły ze sposobu 1 zamykają oba protokoły:RewriteRulejawnie wskazujehttps://w docelowym URL.
Jak sprawdzić, czy przekierowanie nie zepsuło witryny?
Trzy punkty kontrolne: 1) strona główna otwiera się pod katalogiem
/bez przekierowań,curl -Imusi dać 200; 2) adresy URL zindex.phpiindex.htmlzwracają 301 i prowadzą na/; 3) panel administracyjny WordPressa (/wp-admin/) działa bez zapętleń. To ostatnie jest krytyczne: źle napisana reguła w.htaccessmoże przechwycić żądania doindex.phpwewnątrz panelu administracyjnego i zepsuć logowanie. Konstrukcja ze sposobu 1 jest bezpieczna, sprawdza dokładne dopasowanie URI i nie rusza/wp-admin/index.php.
Co zrobić z innymi plikami indeksowymi, index.aspx, index.py?
Mechanika jest taka sama: kopiuje Pan blok
RewriteCond+RewriteRule, zastępuje rozszerzenie i dodaje do.htaccess. Dla niestandardowych rozszerzeń proszę upewnić się, że plik fizycznie istnieje w katalogu głównym i jest wskazany wDirectoryIndex, w przeciwnym razie serwer i tak nie będzie mógł obsłużyć go jako indeksowego, przekierowanie nie będzie potrzebne.
Co robić z duplikatami plików index: końcowa lista kontrolna
Skonfigurowanie przekierowania 301 z index.html i index.php na katalog główny to zadanie z kategorii „pięć minut pracy, lata ochrony". Reguła działa w .htaccess lub index.php transparentnie, nie wymaga obsługi przy zmianie designu lub przenosinach na inny hosting.
Kolejność działań po wprowadzeniu poprawek:
- Proszę sprawdzić przekierowanie przez
curl -Ilubredirectchecker.com, odpowiedź musi być 301. - Proszę upewnić się, że strona główna otwiera się pod katalogiem głównym z kodem 200.
- Proszę przeszukać kod źródłowy stron pod kątem
href="/index.php"ihref="/index.html", każde wystąpienie zastąpić przezhref="/". - W Google Search Console proszę uruchomić sprawdzenie strony głównej, robot musi zobaczyć 200 i kanoniczny URL bez
/index.php.
Po tym w Search Console stopniowo znikną duplikaty z raportu „Pokrycie", a moc linków zwrotnych skoncentruje się na jednej kanonicznej stronie. Rezultat nie jest natychmiastowy, wyszukiwarka potrzebuje czasu na ponowne przeindeksowanie, ale jest nieunikniony.



