Skip to content

Wszystko o WordPressie, tworzeniu stron — i nie tylko

🚀 Jak usunąć index.php i index.html z URL: 301 redirect do katalogu głównego witryny

🚀 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_rewrite w .htaccess, aby przechwytywać żądania do index.html i index.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 -I lub redirectchecker.com, odpowiedź musi być 301 Moved Permanently
  • Proszę przejrzeć wewnętrzne linki witryny i zastąpić /index.php na / 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:

1RewriteEngine On
2
3RewriteCond %{THE_REQUEST} ^[A-Z]{3,9}\ /index\.php\ HTTP/
4RewriteRule ^index\.php$ https://%{HTTP_HOST}/ [R=301,L]
5
6RewriteCond %{THE_REQUEST} ^[A-Z]{3,9}\ /index\.html\ HTTP/
7RewriteRule ^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.php lub /index.html, dokładnie to, co przechwytujemy.
  • RewriteRule przekierowuje żądanie na katalog główny domeny z kodem 301 (stałe przekierowanie). Flaga L (last) zatrzymuje dalsze przetwarzanie reguł.
  • %{HTTP_HOST} automatycznie podstawia domenę witryny, nie trzeba wpisywać jej ręcznie. Protokół jest jawnie wskazany jako https://.

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 на корень
3if ($_SERVER['REQUEST_URI'] === '/index.php') {
4 header('Location: /', true, 301);
5 exit();
6}
7
8// Далее стандартный код WordPress
9define('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:

1location = /index.php {
2 return 301 https://yourdomain.com/;
3}
4
5location = /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ć:

1curl -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 podstawi index.php przez DirectoryIndex, reguła Redirect uruchomi się ponownie, powstanie nieskończona pętla, przeglądarka przerwie ją błędem ERR_TOO_MANY_REDIRECTS. RewriteCond ze 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 żądanie https://site.ru/index.php zwróci kod 200 bez przekierowania. Reguły ze sposobu 1 zamykają oba protokoły: RewriteRule jawnie wskazuje https:// 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 -I musi dać 200; 2) adresy URL z index.php i index.html zwracają 301 i prowadzą na /; 3) panel administracyjny WordPressa (/wp-admin/) działa bez zapętleń. To ostatnie jest krytyczne: źle napisana reguła w .htaccess może przechwycić żądania do index.php wewną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 w DirectoryIndex, 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 -I lub redirectchecker.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" i href="/index.html", każde wystąpienie zastąpić przez href="/".
  • 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.