Czym jest katalog `www` i `public_html` na Twoim koncie hostingowym?
Katalog `public_html` jest katalogiem głównym dokumentów Twojej witryny — folderem po stronie serwera, z którego serwer WWW (Apache, Nginx, LiteSpeed) odczytuje i udostępnia wszystkie publicznie dostępne pliki, gdy odwiedzający ładuje Twoją domenę. Katalog `www`, w większości środowisk współdzielonych i opartych na cPanel, jest po prostu dowiązaniem symbolicznym (symlink) wskazującym na `public_html`, istniejącym ze względu na historyczną kompatybilność, a nie jako niezależna lokalizacja przechowywania danych.
Zrozumienie tej różnicy nie jest kwestią estetyki. Umieszczenie plików poza `public_html`, błędna konfiguracja katalogu głównego dokumentów lub niezrozumienie relacji dowiązania symbolicznego może skutkować niedziałającymi wdrożeniami, błędami 403 Forbidden lub niezamierzonym publicznym ujawnieniem wrażliwych plików konfiguracyjnych.
Rola `public_html` jako katalogu głównego dokumentów
Gdy żądanie HTTP dociera do Twojego serwera, demon serwera WWW sprawdza swoją konfigurację, aby określić, który katalog jest przypisany do żądanej domeny. Ten katalog nazywany jest katalogiem głównym dokumentów. W praktycznie wszystkich środowiskach hostingu współdzielonego i większości konfiguracji VPS Hosting działających na cPanel lub podobnych panelach sterowania, tym katalogiem głównym jest `public_html`.
Bezwzględna ścieżka na typowym serwerze cPanel wygląda następująco:
“`
/home/username/public_html/
“`
Każdy plik umieszczony w tym katalogu staje się publicznie dostępny przez Twoją domenę. Mapowanie jest bezpośrednie:
| Ścieżka pliku na serwerze | Publiczny URL |
|---|---|
| — | — |
| `/home/user/public_html/index.html` | `https://example.com/` |
| `/home/user/public_html/about.html` | `https://example.com/about.html` |
| `/home/user/public_html/images/logo.png` | `https://example.com/images/logo.png` |
| `/home/user/public_html/blog/post-1.php` | `https://example.com/blog/post-1.php` |
| `/home/user/secret-config.php` *(poza public_html)* | Niedostępny przez przeglądarkę |
Ten ostatni wiersz jest kluczowy. Pliki umieszczone powyżej `public_html` w drzewie katalogów — bezpośrednio w `/home/username/` — są niewidoczne dla serwera WWW i nie mogą być pobrane przez HTTP. Jest to właściwa lokalizacja dla wrażliwych plików, takich jak dane uwierzytelniające do bazy danych, pliki `.env` i klucze API, które Twoja aplikacja odczytuje w czasie działania, ale które nigdy nie mogą być publicznie udostępniane.
Domyślne pliki indeksu i rozwiązywanie katalogów
Gdy odwiedzający żąda URL katalogu (np. `https://example.com/`), serwer WWW szuka domyślnego pliku indeksu w tym katalogu. Standardowa kolejność rozwiązywania w dyrektywie `DirectoryIndex` Apache jest zazwyczaj następująca:
“`
index.html > index.htm > index.php > index.cgi
“`
Jeśli żaden z tych plików nie istnieje, a listowanie katalogów nie jest jawnie wyłączone, serwer może zwrócić błąd 403 Forbidden lub ujawnić listę katalogów — co stanowi poważne zagrożenie bezpieczeństwa. Zawsze upewnij się, że istnieje prawidłowy plik indeksu lub że `Options -Indexes` jest ustawione w Twoim `.htaccess`.
Czym naprawdę jest katalog `www`
Katalog `www` jest dowiązaniem symbolicznym POSIX, a nie prawdziwym katalogiem z własnym inodem i alokacją pamięci. Możesz to zweryfikować na dowolnym serwerze opartym na Linux:
“`bash
ls -la ~/
“`
Wynik pokaże coś w rodzaju:
“`
lrwxrwxrwx 1 user user 10 Jan 15 09:22 www -> public_html
drwxr-xr-x 12 user user 4096 Jan 15 09:22 public_html
“`
Znak `l` na początku ciągu uprawnień i strzałka `-> public_html` potwierdzają, że jest to dowiązanie symboliczne. Oznacza to:
- `www` i `public_html` współdzielą dokładnie te same dane inodu
- Zapisanie pliku do `~/www/contact.html` jest identyczne z zapisaniem go do `~/public_html/contact.html`
- Usunięcie `www` nie usuwa `public_html` ani żadnej z jego zawartości
- Odtworzenie dowiązania symbolicznego jest proste: `ln -s ~/public_html ~/www`
Dlaczego dowiązanie symboliczne `www` istnieje
Dowiązanie symboliczne `www` jest artefaktem historycznym o praktycznych korzeniach. We wczesnych środowiskach hostingowych opartych na Unix konwencją było przechowywanie treści WWW w katalogu dosłownie nazwanym `www` — odzwierciedlając prefiks subdomeny `www.`, który stał się powszechny w latach 90. Gdy cPanel ustandaryzował `public_html` jako nazwę katalogu głównego dokumentów, dowiązanie symboliczne `www` zostało zachowane, aby uniknąć zepsucia:
- Starszych skryptów wdrożeniowych zakodowanych na stałe do zapisu w `~/www/`
- Klientów FTP i menedżerów plików, które oczekiwały folderu `www`
- Dokumentacji i samouczków odwołujących się do `www` jako miejsca docelowego przesyłania
Dla wszystkich praktycznych celów w nowoczesnym środowisku powinieneś traktować `public_html` jako kanoniczną lokalizację i całkowicie ignorować `www`.
`public_html` vs `www`: Bezpośrednie porównanie
| Atrybut | `public_html` | `www` |
|---|---|---|
| — | — | — |
| Typ | Prawdziwy katalog | Dowiązanie symboliczne |
| Jest rzeczywistym katalogiem głównym dokumentów | Tak | Nie (wskazuje na `public_html`) |
| Zawiera pliki niezależnie | Tak | Nie (współdzieli inody `public_html`) |
| Można bezpiecznie usunąć | Nie (psuje witrynę) | Tak (witryna działa dalej) |
| Dostępny we wszystkich typach hostingu | Tak | Nie jest gwarantowany |
| Zalecany cel przesyłania | Tak | Niezalecany |
| Istnieje na VPS/niestandardowych konfiguracjach | Konfigurowalny | Rzadko, chyba że utworzony ręcznie |
Struktura katalogów wewnątrz `public_html`
Dobrze zorganizowany katalog `public_html` wyraźnie rozdziela odpowiedzialności. Oto realistyczna dla środowiska produkcyjnego struktura dla witryny opartej na PHP lub instalacji WordPress:
“`
public_html/
├── index.php
├── .htaccess
├── wp-config.php ← WordPress config (ideally moved one level up)
├── wp-content/
│ ├── themes/
│ ├── plugins/
│ └── uploads/
├── assets/
│ ├── css/
│ ├── js/
│ └── images/
└── sitemap.xml
“`
Krytyczna uwaga dotycząca bezpieczeństwa: `wp-config.php` zawiera dane uwierzytelniające do bazy danych. WordPress obsługuje umieszczanie tego pliku o jeden katalog powyżej `public_html` (`/home/username/wp-config.php`), gdzie jest nieosiągalny przez HTTP, ale nadal czytelny przez PHP. Jest to najlepsza praktyka wzmacniania zabezpieczeń, którą wielu administratorów pomija.
Jak subdomeny i domeny dodatkowe rozszerzają tę strukturę
Gdy tworzysz subdomenę lub domenę dodatkową przez Panele sterowania VPS lub cPanel, system hostingowy tworzy nowy katalog główny dokumentów — albo wewnątrz `public_html`, albo jako równoległy katalog na tym samym poziomie.
Katalogi główne dokumentów subdomen
“`
/home/username/public_html/blog/ → blog.example.com
/home/username/public_html/shop/ → shop.example.com
“`
Lub w niektórych konfiguracjach cPanel:
“`
/home/username/blog.example.com/ → blog.example.com
“`
Katalogi główne dokumentów domen dodatkowych
“`
/home/username/public_html/newdomain/ → newdomain.com
“`
Lub jako katalog nadrzędny na tym samym poziomie:
“`
/home/username/newdomain.com/ → newdomain.com
“`
Dokładna ścieżka zależy od konfiguracji Twojego panelu hostingowego. Zawsze weryfikuj katalog główny dokumentów w cPanel w sekcji Domeny > Subdomeny lub Domeny dodatkowe, aby uniknąć przesyłania plików do niewłaściwej lokalizacji.
Różnice w zachowaniu w różnych środowiskach hostingowych
Hosting współdzielony (cPanel)
Na Hostingu współdzielonym z cPanel struktura jest ustandaryzowana:
- Katalog główny dokumentów: `/home/username/public_html/`
- Dowiązanie symboliczne `www`: obecne domyślnie
- Apache z obsługą `.htaccess`: włączone
- Wiele domen: każda otrzymuje własny podkatalog lub równoległy folder
VPS i serwery dedykowane
Na Serwerze dedykowanym lub samodzielnie zarządzanym VPS katalog główny dokumentów jest całkowicie definiowany przez administratora w konfiguracji serwera WWW. Powszechne konwencje:
Wirtualny host Apache (`/etc/apache2/sites-available/example.com.conf`):
“`apache
<VirtualHost *:80>
ServerName example.com
ServerAlias www.example.com
DocumentRoot /var/www/example.com/public_html
</VirtualHost>
“`
Blok serwera Nginx (`/etc/nginx/sites-available/example.com`):
“`nginx
server {
listen 80;
server_name example.com www.example.com;
root /var/www/example.com/public_html;
index index.php index.html;
}
“`
W tych środowiskach `public_html` jest konwencją nazewnictwa, a nie wymogiem technicznym. Katalog główny dokumentów może nosić dowolną nazwę — `/var/www/html/`, `/srv/www/`, `/opt/app/public/` — o ile konfiguracja serwera WWW wskazuje na niego. Dowiązanie symboliczne `www` zazwyczaj nie istnieje, chyba że utworzysz je ręcznie.
VPS z cPanel
VPS z cPanel łączy elastyczność VPS ze ustandaryzowaną strukturą `public_html` hostingu współdzielonego, co czyni go najczęstszym środowiskiem, w którym zarówno `www`, jak i `public_html` współistnieją dokładnie tak, jak opisano w tym artykule.
Uprawnienia plików: Często pomijany wymóg
Nieprawidłowe uprawnienia są jedną z najczęstszych przyczyn błędów 403 Forbidden i nieudanych wdrożeń. Standardowy model uprawnień dla plików dostępnych przez WWW:
| Zasób | Zalecane uprawnienia | Ósemkowo |
|---|---|---|
| — | — | — |
| Katalogi | Odczyt + Wykonanie dla właściciela i grupy | `755` |
| Pliki PHP/HTML | Odczyt/Zapis dla właściciela, Odczyt dla pozostałych | `644` |
| Pliki konfiguracyjne (`.env`, dane uwierzytelniające) | Tylko właściciel | `600` |
| Skrypty wykonywalne | Tylko wykonanie przez właściciela | `700` |
Ustaw uprawnienia rekurencyjnie za pomocą:
“`bash
find ~/public_html -type d -exec chmod 755 {} ;
find ~/public_html -type f -exec chmod 644 {} ;
“`
Nigdy nie ustawiaj `777` na żadnym pliku ani katalogu w środowisku produkcyjnym. Przyznaje to dostęp do zapisu wszystkim użytkownikom systemu i jest bezpośrednim wektorem kompromitacji serwera.
SSL, HTTPS i katalog główny dokumentów
Gdy instalujesz Certyfikat SSL na swojej domenie, certyfikat jest powiązany z nazwą domeny, a nie z konkretnym katalogiem. Jednak konfiguracja wirtualnego hosta HTTPS musi wskazywać na ten sam katalog główny dokumentów `public_html` co konfiguracja HTTP. Niezgodność — gdzie HTTP obsługuje z jednego katalogu, a HTTPS z innego — powoduje niespójne zachowanie, które jest notorycznie trudne do zdiagnozowania.
Jeśli używasz Let’s Encrypt przez Certbot, proces weryfikacji wyzwania ACME umieszcza tymczasowe pliki w `public_html/.well-known/acme-challenge/`. Upewnij się, że ta ścieżka nie jest blokowana przez reguły `.htaccess` ani bloki `location` Nginx, które odmawiają dostępu do ukrytych katalogów (tych zaczynających się od `.`).
Praktyczna lista kontrolna kluczowych wniosków
Przed przesłaniem witryny:
- Potwierdź dokładną ścieżkę katalogu głównego dokumentów w swoim panelu hostingowym — nie zakładaj, że zawsze jest to `/home/username/public_html/`
- Sprawdź, czy `www` jest dowiązaniem symbolicznym, a nie oddzielnym katalogiem, aby uniknąć zduplikowanego zarządzania plikami
- Przenieś wrażliwe pliki konfiguracyjne (`.env`, dane uwierzytelniające do bazy danych) powyżej `public_html`
Podczas wdrożenia:
- Ustaw uprawnienia katalogów na `755` i uprawnienia plików na `644`
- Upewnij się, że `index.html` lub `index.php` istnieje w katalogu głównym dokumentów, aby zapobiec listowaniu katalogów
- Wyłącz `Options Indexes` w `.htaccess` jako środek obrony w głąb
W przypadku konfiguracji z wieloma domenami:
- Potwierdź katalog główny dokumentów dla każdej subdomeny i domeny dodatkowej indywidualnie
- Nie zakładaj, że wszystkie domeny współdzielą ten sam `public_html`
W środowiskach VPS i dedykowanych:
- Zdefiniuj katalog główny dokumentów jawnie w konfiguracji wirtualnego hosta lub bloku serwera
- Dowiązanie symboliczne `www` nie istnieje domyślnie — utwórz je tylko wtedy, gdy wymagają tego starsze skrypty
- Uruchom ponownie serwer WWW po każdej zmianie konfiguracji: `systemctl reload apache2` lub `systemctl reload nginx`
W celu wzmocnienia zabezpieczeń:
- Nigdy nie przechowuj kluczy API, plików `.env` ani konfiguracji bazy danych wewnątrz `public_html`
- Regularnie audytuj `public_html` pod kątem nieoczekiwanych plików, szczególnie w katalogach `uploads/`
- Upewnij się, że Twój wirtualny host SSL wskazuje na ten sam katalog główny dokumentów co konfiguracja HTTP
Często zadawane pytania
Co się stanie, jeśli usunę katalog `www`?
Jeśli `www` jest dowiązaniem symbolicznym (a tak jest w praktycznie wszystkich środowiskach cPanel), jego usunięcie nie ma żadnego wpływu na Twoją witrynę ani jej pliki. Witryna nadal działa normalnie, ponieważ rzeczywista zawartość znajduje się w `public_html`. Możesz odtworzyć dowiązanie symboliczne w dowolnym momencie za pomocą `ln -s ~/public_html ~/www`.
Czy mogę zmienić nazwę `public_html` na coś innego?
Na hostingu współdzielonym nie — panel sterowania jest zakodowany na stałe do używania `public_html` jako katalogu głównego dokumentów. Na samodzielnie zarządzanym VPS lub serwerze dedykowanym możesz nadać katalogowi głównemu dokumentów dowolną nazwę, pod warunkiem że zaktualizujesz konfigurację serwera WWW (`DocumentRoot` w Apache, `root` w Nginx), aby pasowała.
Dlaczego otrzymuję błąd 403 Forbidden, mimo że moje pliki są w `public_html`?
Najczęstsze przyczyny to nieprawidłowe uprawnienia plików (pliki potrzebują co najmniej `644`, katalogi potrzebują `755`), brakujący plik indeksu przy wyłączonym listowaniu katalogów lub reguła `.htaccess` blokująca dostęp. Sprawdź dziennik błędów serwera WWW (`/var/log/apache2/error.log` lub `/var/log/nginx/error.log`) w celu uzyskania konkretnej przyczyny.
Gdzie powinienem przechowywać pliki, które PHP musi odczytać, ale które nie powinny być publicznie dostępne?
Umieść je w katalogu powyżej `public_html`, takim jak `/home/username/private/` lub bezpośrednio w `/home/username/`. PHP może odczytywać pliki w dowolnym miejscu w systemie plików, do którego użytkownik serwera WWW ma uprawnienia dostępu, ale serwer WWW nie będzie udostępniał plików spoza katalogu głównego dokumentów przez HTTP.
Czy subdomena `www` działa inaczej niż domena bez www na poziomie serwera?
Nie. Zarówno `www.example.com`, jak i `example.com` są rozwiązywane do tego samego katalogu głównego dokumentów poprzez konfigurację DNS i ustawienia wirtualnego hosta. Katalog `www` dowiązania symbolicznego w systemie plików nie jest powiązany z subdomeną DNS `www.` — są to oddzielne koncepcje, które przypadkowo współdzielą te same trzy litery.
