Redirect w PHP - przekierowania 301, 302 i praktyczne przykłady

Redirect w PHPRedirect w PHP, czyli przekierowanie użytkownika z jednego adresu URL na inny, jest jedną z podstawowych technik używanych w aplikacjach internetowych, panelach administracyjnych, formularzach, systemach logowania, sklepach internetowych i stronach opartych na własnym kodzie PHP. Najprostszy redirect można wykonać jedną linią z funkcją header(), ale w praktyce sprawa jest bardziej złożona. Trzeba wiedzieć, kiedy użyć przekierowania 301, 302, 303, 307 lub 308, dlaczego przed redirectem nie może zostać wysłana treść HTML, jak uniknąć błędów "headers already sent", kiedy po header("Location: ...") trzeba dodać exit, jak zabezpieczyć przekierowania przed open redirect oraz kiedy lepiej wykonać przekierowanie w .htaccess, konfiguracji serwera albo frameworku zamiast bezpośrednio w PHP.

Czym jest redirect w PHP?

Redirect w PHP to przekierowanie przeglądarki lub klienta HTTP na inny adres. W praktyce serwer wysyła do przeglądarki nagłówek HTTP z informacją, że żądany zasób znajduje się gdzie indziej. Przeglądarka odczytuje ten nagłówek i wykonuje kolejne żądanie pod nowy adres.

Najczęściej redirect w PHP stosuje się, gdy:

  • użytkownik po zalogowaniu ma trafić do panelu,
  • po wysłaniu formularza trzeba przenieść użytkownika na stronę podziękowania,
  • stary adres URL został zastąpiony nowym,
  • trzeba wymusić wersję HTTPS,
  • trzeba przekierować z adresu z www na bez www lub odwrotnie,
  • użytkownik bez uprawnień ma zostać przeniesiony na stronę logowania,
  • aplikacja ma obsługiwać stare linki, które nadal krążą w Google lub na innych stronach,
  • po wykonaniu akcji w panelu administracyjnym trzeba wrócić do listy rekordów.

Wbrew pozorom redirect nie jest tylko kwestią wygody użytkownika. Ma też znaczenie dla bezpieczeństwa, SEO, analityki, indeksowania strony i poprawnego działania formularzy.

W skrócie: redirect w PHP polega na wysłaniu odpowiedniego nagłówka HTTP, najczęściej za pomocą funkcji header(). Samo przekierowanie jest proste, ale poprawne użycie zależy od kontekstu, kodu statusu, momentu wykonania i bezpieczeństwa adresu docelowego.

Najprostszy redirect w PHP - funkcja header()

Najprostsze przekierowanie w PHP wykonuje się za pomocą funkcji header() z nagłówkiem Location. Przykład:

<?php
header("Location: https://example.com/");
exit;
?>

Ten kod informuje przeglądarkę, że ma przejść pod adres https://example.com/. Funkcja exit kończy dalsze wykonywanie skryptu. To bardzo ważne, ponieważ samo wysłanie nagłówka nie oznacza automatycznie, że PHP przestanie wykonywać dalszy kod.

Można też przekierować na adres względny:

<?php
header("Location: /kontakt");
exit;
?>

W praktyce adres względny jest wygodny, gdy przekierowanie odbywa się w obrębie tej samej domeny. Adres absolutny jest czytelniejszy, gdy przekierowujemy na inną domenę lub chcemy jednoznacznie wskazać protokół i host.

Dlaczego po redirect w PHP trzeba dodać exit?

Jednym z najczęstszych błędów początkujących jest pominięcie exit po przekierowaniu. Funkcja header("Location: ...") wysyła nagłówek, ale nie zatrzymuje automatycznie działania skryptu. Oznacza to, że kolejne instrukcje PHP mogą zostać wykonane.

Błędny przykład:

<?php
if (!$userLoggedIn) {
    header("Location: /logowanie");
}

usunPoufneDane();
wyswietlPanelAdmina();
?>

W takim kodzie użytkownik niezalogowany dostanie nagłówek przekierowania, ale PHP może nadal wykonać dalsze funkcje. To może prowadzić do błędów, nieoczekiwanych skutków ubocznych, a w skrajnych przypadkach do problemów bezpieczeństwa.

Poprawny przykład:

<?php
if (!$userLoggedIn) {
    header("Location: /logowanie");
    exit;
}

wyswietlPanelAdmina();
?>

Praktyczna wskazówka: po każdym przekierowaniu wykonywanym przez header("Location: ...") dodawaj exit albo die. To jedna z najprostszych zasad, która zapobiega wielu trudnym do zauważenia błędom.

Błąd headers already sent - najczęstsza pułapka

Redirect w PHP działa tylko wtedy, gdy nagłówki HTTP nie zostały jeszcze wysłane do przeglądarki. Jeżeli wcześniej pojawił się HTML, echo, spacja poza tagiem PHP, znak BOM albo jakikolwiek output, próba wysłania nagłówka może zakończyć się błędem:

Warning: Cannot modify header information - headers already sent

Błędny przykład:

<html>
<body>

<?php
header("Location: /nowy-adres");
exit;
?>

</body>
</html>

W tym przypadku przed funkcją header() wysłano już fragment HTML. PHP nie może więc zmienić nagłówków odpowiedzi.

Poprawny przykład:

<?php
header("Location: /nowy-adres");
exit;
?>

Przekierowania powinny być wykonywane zanim strona zacznie generować HTML. W aplikacjach oznacza to zwykle, że logika przekierowania powinna znaleźć się na początku skryptu, w kontrolerze, middleware albo warstwie obsługi żądania, a nie w środku szablonu.

BOM, puste znaki i niewidoczne problemy

Czasem błąd "headers already sent" pojawia się mimo tego, że przed header() nie widać żadnego HTML-a. Przyczyną może być niewidoczny znak BOM na początku pliku albo spacja po zamykającym tagu PHP w pliku dołączanym przez include lub require.

Ryzykowny schemat:

<?php
// plik config.php
$siteName = "Moja strona";
?>
 

Jeżeli po zamykającym tagu ?> znajduje się spacja albo nowa linia, może ona zostać wysłana jako output. Dlatego w plikach zawierających tylko PHP często pomija się zamykający tag.

Bezpieczniej:

<?php
// plik config.php
$siteName = "Moja strona";

Kody przekierowań 301, 302, 303, 307 i 308

Przekierowanie to nie tylko adres docelowy. Ważny jest też kod statusu HTTP. To on informuje przeglądarkę, roboty wyszukiwarek i inne klienty, czy przekierowanie jest stałe, tymczasowe, czy wynika np. z obsługi formularza.

Kod Znaczenie Kiedy używać? Uwaga praktyczna
301 Moved Permanently Stała zmiana adresu URL Najczęściej używany przy SEO, migracjach i zmianach adresów.
302 Found Tymczasowe przekierowanie Dobry przy redirectach zależnych od sesji, akcji użytkownika lub czasowej zmiany.
303 See Other Redirect po formularzu POST Dobry przy wzorcu POST/Redirect/GET.
307 Temporary Redirect Tymczasowe przekierowanie z zachowaniem metody HTTP Przydatne, gdy metoda POST ma pozostać POST.
308 Permanent Redirect Stałe przekierowanie z zachowaniem metody HTTP Podobne do 301, ale bardziej rygorystycznie zachowuje metodę.

Najczęściej w zwykłych stronach spotkasz 301 i 302. Przy formularzach warto znać 303, a przy API i bardziej technicznych integracjach znaczenie mogą mieć 307 i 308.

Redirect 301 w PHP - trwałe przekierowanie

Redirect 301 oznacza trwałe przekierowanie. Stosuje się go wtedy, gdy stary adres został definitywnie zastąpiony nowym. Ma to duże znaczenie dla SEO, ponieważ roboty wyszukiwarek traktują 301 jako sygnał, że adres docelowy powinien zastąpić stary URL.

Przykład przekierowania 301 w PHP:

<?php
header("Location: https://example.com/nowy-adres", true, 301);
exit;
?>

Parametr true oznacza, że nagłówek o tej samej nazwie ma zostać zastąpiony, a 301 to kod statusu odpowiedzi.

Kiedy użyć 301?

  • gdy zmieniasz adres artykułu na stałe,
  • gdy łączysz dwie podstrony w jedną,
  • gdy przenosisz stronę na nową domenę,
  • gdy usuwasz końcówkę .php lub .html z adresów,
  • gdy ustalasz jedną wersję domeny, np. bez www,
  • gdy przechodzisz z HTTP na HTTPS.

Kiedy nie używać 301?

  • gdy przekierowanie jest tylko testowe,
  • gdy adres docelowy może się zmienić,
  • gdy użytkownik ma być chwilowo przekierowany, np. po logowaniu,
  • gdy chodzi o akcję po wysłaniu formularza,
  • gdy redirect zależy od sesji użytkownika.

Uwaga: przekierowania 301 mogą być cache'owane przez przeglądarki i pośrednie systemy. Jeżeli ustawisz błędny redirect 301, jego odkręcenie może być bardziej kłopotliwe niż przy 302.

Redirect 302 w PHP - tymczasowe przekierowanie

Redirect 302 oznacza przekierowanie tymczasowe. Stosuje się go wtedy, gdy adres źródłowy nadal pozostaje właściwy, ale użytkownik ma chwilowo zostać przeniesiony gdzie indziej.

<?php
header("Location: /promocja-tymczasowa", true, 302);
exit;
?>

Kiedy użyć 302?

  • gdy przekierowanie zależy od sesji użytkownika,
  • gdy trwa tymczasowa promocja,
  • gdy strona jest chwilowo niedostępna,
  • gdy testujesz nowy adres, ale nie chcesz przekazywać sygnału trwałej zmiany,
  • gdy przekierowanie działa tylko w określonych warunkach, np. język, lokalizacja, status konta.

Warto pamiętać, że domyślny header("Location: ...") w PHP zwykle skutkuje przekierowaniem tymczasowym, jeżeli nie podasz własnego kodu statusu. Mimo to lepiej zapisywać kod jawnie, bo wtedy intencja jest czytelna.

<?php
header("Location: /panel", true, 302);
exit;
?>

Redirect po formularzu - wzorzec POST/Redirect/GET

Jednym z najważniejszych praktycznych zastosowań redirectu w PHP jest obsługa formularzy. Po wysłaniu formularza metodą POST nie powinno się zwykle od razu wyświetlać końcowej strony w odpowiedzi na POST. Lepszym rozwiązaniem jest wzorzec POST/Redirect/GET.

Schemat działania jest prosty:

  1. Użytkownik wysyła formularz metodą POST.
  2. PHP waliduje dane i zapisuje je w bazie albo wysyła wiadomość.
  3. PHP wykonuje redirect na stronę podziękowania lub wynik.
  4. Użytkownik widzi stronę przez żądanie GET.

Dzięki temu odświeżenie strony nie powoduje ponownego wysłania formularza.

Przykład:

<?php

if ($_SERVER["REQUEST_METHOD"] === "POST") {
    $email = filter_input(INPUT_POST, "email", FILTER_VALIDATE_EMAIL);

    if (!$email) {
        header("Location: /kontakt?error=email", true, 303);
        exit;
    }

    // Tutaj np. zapis do bazy lub wysyłka maila

    header("Location: /dziekujemy", true, 303);
    exit;
}

?>

Kod 303 jest w tym przypadku bardzo dobrym wyborem, ponieważ informuje klienta, że po przetworzeniu POST powinien pobrać inny zasób metodą GET.

Z doświadczenia: brak redirectu po formularzu to częsty powód podwójnie wysłanych wiadomości, zdublowanych zamówień testowych, ponownych zapisów do bazy i komunikatu przeglądarki o ponownym przesłaniu formularza.

Redirect po logowaniu i wylogowaniu

Redirect po logowaniu to klasyczny przykład przekierowania zależnego od stanu użytkownika. Po poprawnym logowaniu użytkownik powinien trafić do panelu, a po wylogowaniu np. na stronę główną lub ekran logowania.

Przykład po zalogowaniu:

<?php

session_start();

if ($_SERVER["REQUEST_METHOD"] === "POST") {
    $login = $_POST["login"] ?? "";
    $password = $_POST["password"] ?? "";

    if ($login === "admin" && $password === "tajne") {
        $_SESSION["user_id"] = 1;

        header("Location: /panel", true, 302);
        exit;
    }

    header("Location: /logowanie?error=1", true, 302);
    exit;
}

?>

Przykład po wylogowaniu:

<?php

session_start();

$_SESSION = [];
session_destroy();

header("Location: /logowanie?logout=1", true, 302);
exit;

?>

W przypadku logowania zwykle nie stosuje się 301, bo nie jest to trwała zmiana adresu. To przekierowanie zależne od akcji użytkownika i stanu sesji.

Redirect warunkowy w PHP - przykłady praktyczne

W PHP często wykonuje się redirect tylko wtedy, gdy spełniony jest określony warunek. To może być brak logowania, brak uprawnień, nieprawidłowy parametr, stary adres, wybrany język albo niedostępny zasób.

Redirect, gdy użytkownik nie jest zalogowany

<?php

session_start();

if (empty($_SESSION["user_id"])) {
    header("Location: /logowanie", true, 302);
    exit;
}

?>

Redirect, gdy użytkownik nie ma uprawnień

<?php

if ($userRole !== "admin") {
    header("Location: /brak-dostepu", true, 302);
    exit;
}

?>

Redirect, gdy brakuje parametru w URL

<?php

$id = filter_input(INPUT_GET, "id", FILTER_VALIDATE_INT);

if (!$id) {
    header("Location: /produkty", true, 302);
    exit;
}

?>

Redirect starego adresu na nowy

<?php

$oldPath = $_SERVER["REQUEST_URI"] ?? "";

if ($oldPath === "/stary-artykul.php") {
    header("Location: /nowy-artykul", true, 301);
    exit;
}

?>

Redirect językowy

Przykład prostego przekierowania na podstawie wybranego języka:

<?php

$lang = $_GET["lang"] ?? "pl";

$allowed = ["pl", "en", "de"];

if (!in_array($lang, $allowed, true)) {
    $lang = "pl";
}

header("Location: /" . $lang . "/", true, 302);
exit;

?>

W tym przykładzie ważna jest lista dozwolonych wartości. Bez niej łatwo wprowadzić błąd albo podatność.

Redirect na HTTPS, bez www i z www

Częstym zadaniem jest wymuszenie jednej kanonicznej wersji adresu. Strona może być dostępna pod różnymi wariantami:

  • http://example.com
  • http://www.example.com
  • https://example.com
  • https://www.example.com

Dla SEO, analityki i porządku technicznego zwykle wybiera się jedną wersję, np. https://example.com, a pozostałe przekierowuje 301.

Redirect HTTP na HTTPS w PHP

<?php

$isHttps = !empty($_SERVER["HTTPS"]) && $_SERVER["HTTPS"] !== "off";

if (!$isHttps) {
    $host = $_SERVER["HTTP_HOST"];
    $uri = $_SERVER["REQUEST_URI"];

    header("Location: https://" . $host . $uri, true, 301);
    exit;
}

?>

Ten kod może działać w prostych warunkach, ale na serwerach za proxy, CDN lub load balancerem sprawa bywa bardziej złożona, bo HTTPS może być terminowany przed serwerem aplikacyjnym. Wtedy trzeba sprawdzać np. nagłówki typu X-Forwarded-Proto, o ile są zaufane i poprawnie skonfigurowane.

Redirect z www na bez www

<?php

$host = $_SERVER["HTTP_HOST"] ?? "";

if ($host === "www.example.com") {
    $uri = $_SERVER["REQUEST_URI"] ?? "/";
    header("Location: https://example.com" . $uri, true, 301);
    exit;
}

?>

Redirect z bez www na www

<?php

$host = $_SERVER["HTTP_HOST"] ?? "";

if ($host === "example.com") {
    $uri = $_SERVER["REQUEST_URI"] ?? "/";
    header("Location: https://www.example.com" . $uri, true, 301);
    exit;
}

?>

Praktyczna wskazówka: przekierowania domenowe i HTTPS często lepiej wykonać w konfiguracji serwera, np. .htaccess, nginx albo panelu hostingu. PHP zadziała dopiero po uruchomieniu aplikacji, więc jest zwykle mniej wydajne dla globalnych przekierowań technicznych.

Redirect w PHP a SEO

Przekierowania mają duże znaczenie dla SEO. Jeżeli zmieniasz adresy URL, usuwasz stare podstrony albo porządkujesz strukturę serwisu, odpowiednie redirecty pomagają użytkownikom i robotom wyszukiwarek trafić do właściwych treści.

Najważniejsze zasady SEO przy redirectach:

  • dla trwałych zmian adresów używaj 301 albo 308,
  • dla zmian tymczasowych używaj 302 albo 307,
  • nie przekierowuj wszystkich starych adresów bezmyślnie na stronę główną,
  • unikaj łańcuchów przekierowań, np. A - B - C - D,
  • unikaj pętli przekierowań, np. A - B - A,
  • przekierowuj na możliwie najbardziej odpowiadającą treść,
  • po migracji sprawdzaj kody odpowiedzi i indeksowanie,
  • aktualizuj linki wewnętrzne, zamiast stale polegać na redirectach.

Dobry redirect SEO

Stary artykuł:

/stare-porady/php-redirect.php

Nowy artykuł:

/programowanie/redirect-w-php

Przekierowanie:

<?php
header("Location: /programowanie/redirect-w-php", true, 301);
exit;
?>

Słaby redirect SEO

Stare artykuły o różnych tematach przekierowane wszystkie na stronę główną:

/php-redirect -> /
/formularze-php -> /
/sesje-php -> /
/mysql-php -> /

To jest słabe, bo użytkownik nie trafia do treści odpowiadającej temu, czego szukał. Jeżeli nie ma zamiennika, czasem lepsza jest dobrze zaprojektowana strona 404 lub 410 niż masowe przekierowanie na stronę główną.

Bezpieczeństwo redirectów - open redirect i walidacja URL

Redirect w PHP może stać się podatnością, jeżeli adres docelowy pochodzi bezpośrednio od użytkownika. Problem nazywa się open redirect. Polega na tym, że atakujący może przygotować link do Twojej domeny, który następnie przekierowuje użytkownika na zewnętrzną, fałszywą lub złośliwą stronę.

Niebezpieczny przykład:

<?php
$url = $_GET["url"] ?? "/";
header("Location: " . $url);
exit;
?>

Taki kod pozwala na link w stylu:

https://example.com/redirect.php?url=https://podejrzana-strona.example

Użytkownik widzi początkowo zaufaną domenę, ale po chwili zostaje przeniesiony gdzie indziej. To może być wykorzystywane w phishingu.

Bezpieczniejszy redirect tylko na ścieżki wewnętrzne

<?php

$next = $_GET["next"] ?? "/";

if (!is_string($next) || !str_starts_with($next, "/") || str_starts_with($next, "//")) {
    $next = "/";
}

header("Location: " . $next, true, 302);
exit;

?>

Ten kod pozwala na przekierowanie w obrębie tej samej domeny, np. na /panel, ale odrzuca adresy zewnętrzne i podejrzane adresy zaczynające się od //.

Redirect z białą listą adresów

Jeszcze bezpieczniejsze rozwiązanie to biała lista dozwolonych ścieżek:

<?php

$allowedRedirects = [
    "panel" => "/panel",
    "konto" => "/moje-konto",
    "zamowienia" => "/moje-konto/zamowienia",
];

$key = $_GET["to"] ?? "panel";

$target = $allowedRedirects[$key] ?? "/";

header("Location: " . $target, true, 302);
exit;

?>

To dobre podejście np. po logowaniu, gdy użytkownik ma wrócić do jednego z kilku znanych miejsc w serwisie.

Uwaga bezpieczeństwa: nigdy nie przekierowuj bez kontroli na adres pobrany bezpośrednio z $_GET, $_POST lub ciasteczka. Najbezpieczniejsze są ścieżki wewnętrzne albo biała lista dozwolonych adresów.

Redirect w frameworkach PHP

W nowoczesnych aplikacjach PHP rzadko wykonuje się przekierowania bezpośrednio przez header() w losowym miejscu kodu. Frameworki mają własne mechanizmy odpowiedzi HTTP. Dzięki temu redirect jest częścią uporządkowanego przepływu aplikacji.

Redirect w Laravel

return redirect('/panel');

Przekierowanie na nazwaną trasę:

return redirect()->route('dashboard');

Redirect z komunikatem w sesji:

return redirect()
    ->route('contact')
    ->with('success', 'Wiadomość została wysłana.');

Redirect w Symfony

return $this->redirectToRoute('dashboard');

Redirect na konkretny URL:

return $this->redirect('/panel');

Redirect w WordPress

W WordPressie często używa się funkcji wp_redirect() lub wp_safe_redirect().

<?php
wp_redirect(home_url('/dziekujemy/'));
exit;
?>

Bezpieczniejsza wersja dla przekierowań wewnętrznych:

<?php
wp_safe_redirect(home_url('/panel/'));
exit;
?>

W WordPressie również trzeba pamiętać o exit po przekierowaniu.

Redirect w PHP czy .htaccess - co wybrać?

Nie każde przekierowanie powinno być wykonywane w PHP. Często lepszym miejscem jest konfiguracja serwera, szczególnie gdy chodzi o przekierowania globalne, domenowe i techniczne.

Rodzaj przekierowania Lepsze miejsce Dlaczego?
HTTP na HTTPS Serwer / .htaccess / panel hostingu Szybciej i wcześniej niż uruchomienie aplikacji PHP.
www na bez www Serwer / .htaccess To globalna reguła domenowa.
Stare adresy artykułów Zależy od skali Kilka adresów można obsłużyć w PHP, dużą migrację lepiej w regułach lub mapie.
Redirect po logowaniu PHP / framework Zależy od sesji i logiki aplikacji.
Redirect po formularzu PHP / framework Jest częścią logiki przetwarzania danych.
Redirect zależny od uprawnień PHP / framework Wymaga informacji o użytkowniku.

Ogólna zasada jest prosta: przekierowania techniczne i globalne lepiej obsługiwać jak najwcześniej, czyli na poziomie serwera. Przekierowania zależne od użytkownika, sesji, formularza lub logiki biznesowej powinny być w PHP.

Najczęstsze błędy przy przekierowaniach PHP

Przekierowania są proste dopóki działają. Gdy pojawi się pętla, błędny status, output przed nagłówkiem albo niezabezpieczony adres, problem może być trudniejszy do wykrycia. Oto najczęstsze błędy.

Brak exit po header Location

To podstawowy błąd. Po przekierowaniu skrypt powinien zostać zakończony.

<?php
header("Location: /panel");
exit;
?>

Wysłanie HTML przed header()

Jeżeli jakakolwiek treść została wysłana przed nagłówkiem, redirect może nie zadziałać. Może to być nie tylko widoczny HTML, ale również przypadkowa spacja, znak BOM, komunikat błędu, echo lub output z dołączonego pliku.

Zły kod statusu

301 dla tymczasowej akcji po logowaniu albo 302 dla stałej migracji adresu to częste błędy. Kod statusu powinien odpowiadać intencji. Stała zmiana adresu to zwykle 301, a tymczasowa akcja użytkownika to zwykle 302 lub 303.

Pętla przekierowań

Pętla powstaje, gdy URL A przekierowuje na B, a B z powrotem na A, albo gdy warunek przekierowania nigdy nie przestaje być spełniony.

Błędny przykład:

<?php

if ($_SERVER["REQUEST_URI"] !== "/nowy-adres") {
    header("Location: /nowy-adres", true, 301);
    exit;
}

if ($_SERVER["REQUEST_URI"] === "/nowy-adres") {
    header("Location: /stary-adres", true, 301);
    exit;
}

?>

Łańcuchy przekierowań

Łańcuch wygląda np. tak:

http://example.com/stary
-> https://example.com/stary
-> https://www.example.com/stary
-> https://www.example.com/nowy

Lepiej przekierować od razu do końcowego adresu:

http://example.com/stary
-> https://www.example.com/nowy

Open redirect

Nie wolno bez walidacji przekierowywać na adres podany przez użytkownika. To może prowadzić do phishingu i nadużyć.

Redirect zamiast sensownego 404 lub 410

Nie każda usunięta strona powinna być przekierowana. Jeżeli nie ma odpowiednika, przekierowanie na stronę główną może być mylące. Przy treści definitywnie usuniętej można rozważyć status 410 Gone, a przy brakującym zasobie dobrze przygotowaną stronę 404.

Praktyczna checklista redirectu w PHP

Przed wdrożeniem przekierowania warto przejść krótką checklistę:

  • Czy redirect wykonuje się przed wysłaniem HTML?
  • Czy po header("Location: ...") jest exit?
  • Czy kod statusu jest właściwy: 301, 302, 303, 307 albo 308?
  • Czy adres docelowy jest poprawny i nie tworzy pętli?
  • Czy redirect nie tworzy łańcucha kilku przekierowań?
  • Czy adres z parametru użytkownika jest walidowany?
  • Czy przy SEO użyto trwałego przekierowania tylko wtedy, gdy zmiana jest naprawdę trwała?
  • Czy globalnego redirectu nie lepiej zrobić w .htaccess lub konfiguracji serwera?
  • Czy po wdrożeniu sprawdzono nagłówki HTTP?

FAQ - redirect w PHP

Jak zrobić redirect w PHP?

Najprościej użyć funkcji header("Location: /nowy-adres"), a zaraz po niej dodać exit. Przykład: header("Location: /kontakt"); exit;.

Czy po header Location trzeba dawać exit?

Tak, to bardzo dobra praktyka. Funkcja header() wysyła nagłówek przekierowania, ale nie zatrzymuje automatycznie dalszego wykonywania kodu PHP. Bez exit skrypt może wykonać kolejne instrukcje.

Jak zrobić redirect 301 w PHP?

Redirect 301 można wykonać tak: header("Location: /nowy-adres", true, 301); exit;. Kod 301 oznacza trwałe przekierowanie i jest używany przy stałej zmianie adresu URL.

Czym różni się redirect 301 od 302?

301 oznacza przekierowanie trwałe, a 302 tymczasowe. Przy zmianach adresów ważnych dla SEO zwykle stosuje się 301. Przy akcjach użytkownika, logowaniu lub przekierowaniach zależnych od sesji częściej stosuje się 302.

Dlaczego pojawia się błąd headers already sent?

Błąd oznacza, że przed wywołaniem header() została już wysłana jakaś treść, np. HTML, echo, spacja, znak BOM albo output z dołączonego pliku. Przekierowanie trzeba wykonać przed wysłaniem treści do przeglądarki.

Jaki kod redirectu wybrać po wysłaniu formularza?

Po formularzu metodą POST często najlepszym wyborem jest 303 See Other. Pozwala zastosować wzorzec POST/Redirect/GET, dzięki któremu odświeżenie strony nie powoduje ponownego wysłania formularza.

Czy redirect w PHP jest dobry dla SEO?

Tak, jeżeli jest użyty poprawnie. Przy trwałej zmianie adresu warto stosować 301 i przekierowywać na najbardziej odpowiadającą treść. Należy unikać pętli, łańcuchów redirectów i masowego przekierowywania wszystkiego na stronę główną.

Czy redirect na adres z parametru GET jest bezpieczny?

Nie, jeśli adres nie jest walidowany. Może to prowadzić do podatności open redirect. Bezpieczniej używać ścieżek wewnętrznych, białej listy dozwolonych adresów albo funkcji frameworka, które ograniczają przekierowania do zaufanych lokalizacji.

Lepiej robić redirect w PHP czy w .htaccess?

To zależy od rodzaju przekierowania. Globalne przekierowania techniczne, np. HTTP na HTTPS albo www na bez www, zwykle lepiej zrobić w .htaccess lub konfiguracji serwera. Redirect zależny od logowania, sesji lub formularza powinien być w PHP.

Czy można zrobić redirect po kilku sekundach w PHP?

Technicznie można użyć nagłówka Refresh, ale nie jest to typowy redirect HTTP i zwykle nie jest najlepszym rozwiązaniem. Jeżeli zależy Ci na SEO i poprawnym zachowaniu HTTP, lepiej użyć Location. Opóźnione przekierowania częściej robi się po stronie HTML lub JavaScript, ale trzeba je stosować ostrożnie.

Komentarze