Pliki .htaccess - ustawienie przekierowań i poprawiania adresów URL

0

Ukończyłem pracę nad stroną, pliki wrzuciłem na serwer - gra gitara; Strona jest widoczna w sieci, linki śmigają, wszystko się dobrze ładuje; Ale to nie wszystko, bo mały błąd w podaniu adresu w pasku przeglądarki i już moja strona błędu nie zadziała;

Dlatego też wyczytałem w Google, że trzeba odpowiednio uzupełnić plik(i) .htaccess; Poczytałem, potestowałem i lipa - nie potrafię tego zrobić tak, aby wszystko działało; A że webmaster ze mnie gorszy niż kosmonauta - nie rozumiem jak mam te pliki porozmieszczać i co w nich wpisać... Dlatego też prosiłbym o pomoc, dlatego że nigdy wcześniej nie stawiałem żadnych stron i w ogóle nie zajmuję się webmasteringiem, więc nauka pewnych rzeczy z tą dziedziną związanych idzie mi jak krew z nosa; A stronę jak już podjąłem się zrobić, to chciałbym aby jakoś pomagała użytkownikowi w przypadku podania błędnych adresów;


Może najpierw opiszę co mam; Struktura katalogów na serwerze wygląda tak:

[public_html]
  [global]
    - pliki używane dla obu subdomen
  [en]
    - pusty katalog (strony w wersji angielskiej jeszcze nie ma - będzie w przyszłości)
  [pl]
    - pliki strony w wersji polskiej

Główna domena posiada dwie subdomeny - pl dla polskiej strony i en dla angielskiej; Katalogi utworzone zostały w tych miejscach przez menedżer w panelu klienta, więc ich nie przenosiłem; Natomiast katalog global zawiera pliki uniwersalne, które wykorzystywane będą w dwóch wersjach językowych strony; Znajdują się tam pliki arkuszy stylów, fonty i obrazki;

W głównym katalogu public_html znajdują się także pliki błędów: 400.htm, 401.htm, 403.htm, 404.htm i 500.htm; Te pliki będą wykorzystywane po jakimś błędzie, np. nieodnalezieniu zasobu czy braku dostępu do niego; Także w głównym katalogu mam standardowo pusty plik .htaccess, który trzeba uzupełnić;

Nie chcę reklamować swojej strony (żeby nie dostać bana za spam :]) więc przyjmijmy, że moja strona ma adres strona.info; Biorąc pod uwagę stworzone dwie subdomeny, otrzymujemy dodatkowe adresy pl.strona.info oraz en.strona.info (we wszystkich przypadkach bez prefiksu www);


Teraz co chciałbym uzyskać; Jeśli walnę jakąś łupotę to miejcie na uwadze, że nawet po solidnej lekturze Google - nadal jestem lamą w tym temacie;

Przede wszsytkim chciałbym sprawić, aby po nieodnalezieniu zasobu, serwer przekierowywał na moją stronę odpowiedniego błędu; W tym celu dopisałem do pliku .htaccess wygooglowane linijki:

ErrorDocument 400 http://strona.info/400.htm
ErrorDocument 401 http://strona.info/401.htm
ErrorDocument 403 http://strona.info/403.htm
ErrorDocument 404 http://strona.info/404.htm
ErrorDocument 500 http://strona.info/500.htm

No i gra - po wykryciu błędu zostaję przekierowany na odpowiednią stronę błędu; Czego jednak bym nie chciał - jeśli użytkownik spowoduje błąd serwera, adres URL w pasku adresu przeglądarki nie powinien się zmienić na np. strona.info/404.htm, a powinien pozostać ten błędny; Dokładnie tak samo jest na 4programmers - pojawia się strona błędu, ale URL nie jest poprawiany; Jak więc uzyskać taki efekt?


Druga sprawa to przekierowywanie użytkownika na poprawną stronę i poprawianie adresu URL;

Chciałbym uzyskać taki efekt, aby po wpisaniu adresu strony bez subdomeny, adres ten był poprawiany oraz użytkownik powinien być przekierowany na odpowiedni plik, znajdujący się w katalogu subdomeny;

Poniżej wymienione są przykłady - z lewej podany URL, a z prawej poprawiony przez oprogramowanie serwera:

  • strona.info/index.htm -> http://pl.strona.info/index.htm (dodanie nazwy subdomeny),
  • strona.info/pl/index.htm -> http://pl.strona.info/index.htm (dodanie nazwy subdomeny oraz usunięcie nazwy katalogu subdomeny sprzed nazwy pliku),
  • strona.info/pl/foo/bar/index.htm -> http://pl.strona.info/foo/bar/index.htm (to samo, tyle że URL posiada dłuższą ścieżkę do pliku);
    W tym stylu - każdorazowe dodanie prefiksu http:// oraz nazwy subdomeny pl przed adresem, oraz usunięcie nazwy katalogu pl/ z dalszej części adresu; Jak więc to zrobić?

Ostatnia sprawa nie dotyczy może konfiguracji, a samych ścieżek w plikach strony; Zależy mi na tym, aby wszystkie ścieżki w plikach .htm były relatywne; Już tłumacze dlaczego;

Stronę chcę utrzymywać po pierwsze na serwerze, ale także lokalnie, bez dostępu do sieci; Czyli nie chcę posiadać dwóch wersji - jednej dla serwera i jednej w wersji offline; Dlatego też wykorzystałem ścieżki względne, które działają bez problemu lokalnie i poprawnie na serwerze; Strona nie korzysta ani ze skryptów, ani z ciasteczek, więc będzie można ją otworzyć bez problemu wszędzie;

Wyczytałem w Google, że raczej nie ma problemu z używaniem względnych ścieżek na serwerze; Zresztą wrzuciłem stronę na serwer dla testów i wszystko działa poprawnie; To oczywiście nie dotyczy stron błędów, które jak wyczytałem w Google powinny mieć ścieżki bezwzględne - ot dla bezpieczeństwa;

Moje pytanie jest takie: Czy po wpisaniu reguł do pliku .htaccess nie będą się one gryzły ze ścieżkami relatywnymi?

Z moich wczorajszych testów wynikło, że jednak będzie problem, tylko ze ścieżkami do plików z katalogu public_html/global/, bo ich w ogóle nie chciało czytać; Dlatego też szybciutko zmieniłem we wszystkich plikach .htm adresy do plików z tego katalogu na bezwzględne i dzięki temu były poprawnie ładowane;


Bardzo bym prosił o pomoc z uzupełnieniem tego pliku konfiguracyjnego, dlatego że po wielu próbach i przeczytaniu kilku artykułów nadal nie potrafię tego poprawnie ustawić; Korzystałem głównie z tych artykułów:

https://pomoc.home.pl/bazawiedzy/akademia/278
http://magazynt3.pl/htaccess-bez-tajemnic-sztuczki-z-serwerem-Apache/

i kilku innych; Ale nadal nie mogę się w tym w połapać i zapisać te reguły poprawnie; Byłbym bardzo wdzięczny, gdyby ktoś użyczył wiedzy w tym temacie;


PS1: Ze subdomeny en póki co i tak nie będę korzystał, więc ewentualnie mogę usunąć jej katalog; Ważne, żeby przekierowania działały i kierowały na subdomenę pl.strona.info/*;

PS2: W Google także wyczytałem, że roboty indeksujące bardzo nie lubią, jak serwis zezwala na podawanie adresów z prefiksem www oraz bez niego, dlatego w przykładach celowo ich nie podawałem; Czyli trzeba by te reguły zapisać tak, aby usuwane były te prefiksy, jeśli takowe istnieją...

PS3: Jeśli jakiejś ważnej informacji nie podałem, to pytajcie śmiało o wszystko :]

1
  1. Jak zrobić żeby adres strony pozostał taki sam

Spróbuj patentu z Drupala

# Make Drupal handle any 404 errors.
ErrorDocument 404 /index.php 

Działa, ponieważ w Drupalu większość adresów obsługiwana jest przez index.php a podadresy są podawane jako parametr do tego skryptu.

A w kodzie:
a) wykrycie że strona jest niewłaściwa
b) wygenerowanie nagłówka 404

drupal_add_http_header('Status', '404 Not Found'); * => http:*php.net/manual/en/function.header.php

c) zalogowanie błędu

d) wygenerowanie strony opisowej (w zaawansowanej wersji polecam dodanie automatycznego wyszukiwania stron wg słów z szukanego adresu)

  1. Wersja dla serwera lokalnego i zdalnego jest raczej nieunikniona. Mi się przynajmniej nigdy nie udało zrobić tak żeby pasowało do obydwu.

  2. Zajrzyj tutaj:
    http://www.webmasterworld.com/apache/4128058.htm
    http://www.htaccesstools.com/redirection-by-language/

2

Po primo po co pchasz sie w subdomeny?? Ogolnie najprostsza i najlepsza metoda jest uzywanie podfolderow, czyli nie zmuszaj strony na sile do dzialania pod www.en.strona.info, tylko
www.strona.info/en, www.strona.info/pl itd. itd. Bedzie latwiej zarzadzac i google lepiej to zindeksuje, bo wersje jezykowe wciaz beda indeksowac jedna strone.

Domyslam sie ze nie jedziesz na samym htmlu tylko uzywasz jakiegos jezyka server-side do generowania i spinania tego contentu. Kolega wyzej nakeirowal cie na rozwiazanie. po prostu uzyj pliku glownego, ktory bedzie lapal wszystkie adresy i na podstawie tego adresu budowal zawartosc. moze byc to na podstawie samych plikow bez bazy, gdzie bedziesz mial w kodzie liste plikow i ich aliasow i na pdostawie tego bedziesz ladowal odpowiednie pliku po wczytaniu adresu, ew w bazie danych lista stron z ich adresami (rozwiazanie lepsze bo pozwala na tworzenie kilku aliasow dla danej podstrony).

po takim czyms jak juz mowile w kodzie sprawdzasz czy dany url jest poprawny i ladujesz zawartosc pliku z contentem, jesli nie to ladujesz zawartosc pliku 404 czy 500 czy jaki tam blad wyskoczy.

zeby wszystko przekierowywac do pliku index to uzyj reguly rewrite w .htaccess, ktora nie zmienia adresu a tylko laduje plik

tu przyklad z php, ale jezyk nie ma znaczenia
http://jrgns.net/redirect_request_to_index/

ogolnie do przekierowywania (kod naglowka 300 i 301) uzywamy redirect -> wtedy adres sie zmienia i google indeksuje nowa strone (przydatne jak zmieniamy url,a wciaze pozostawiamy stary adres, zeby nie bylo duplikowania zawartosci ze strony google to robimy wlasnie przekierowanie.

a do wczytywania zawartosci bez zmiany adresu url uzywamy rewrite. wtedy adres sie nie zmienia a odpalany jest inny plik.

0

Dobra chłopaki, dziękuję za odpowiedzi;

Może najpierw uściślę; Nie korzystam z żadnego języka, nie buduję contentu dynamicznie - mam jedynie niezależne pliki HTML i CSS, które określają ich wygląd; Nie potrzebuję nic więcej, bo strony nie będę modyfikował co tydzień - raczej co pół roku dodam kilka linijek i tyle; Dzięki temu łatwo będzie mi utrzymywać dwie wersje strony;


Co więc uczyniłem;

1. Usunąłem subdomeny - zostawiłem jedynie katalog pl/ z plikami strony w wersji polskiej;

2. Ustawiłem sobie przekierowania na własne strony błędów, standardowo za pomocą instrukcji ErrorDocument; Dzięki temu strony elegancko pokazują się, jeśli danego zasobu nie będzie pod wybranym adresem; W nich zastosowałem ścieżki bezwzględne;

3. Ustaliłem sobie typy MIME dla plików fontów, za pomocą instrukcji AddType; Znalazłem sporo wątków na StackOverflow, w których podane było jak to zrobić; Dodałem sobie też kod, który pomoże Firefoxowi obsługiwać @font-face (muszę to jeszcze sprawdzić):

<FilesMatch "\.(otf|ttf|svg|woff|eot)$">
    <IfModule mod_headers.c>
        Header set Access-Control-Allow-Origin "*"
    </IfModule>
</FilesMatch>

4. Ustawiłem sobie przekierowanie głównego adresu na plik z katalogu pl/; Znalazłem także na StackOverflow przykład takiej reguły:

RewriteRule ^$ /pl/index.htm [L,R=301]
Działa jak należy;

5. Dodałem regułę, która usuwa prefiks www z adresów, także znalezioną gdzieś w sieci:

RewriteCond %{HTTP_HOST} ^www\.(.*)$ [NC]
RewriteRule ^(.*)$ http://%1%{REQUEST_URI} [R=301,QSA,NC,L]

No i działa prawidłowo;


Uzyskany efekt jest zadowalający i na tym poprzestanę zabawę z .htaccess; Tak więc wątek uważam za zakończony; Jeszcze raz dziękuję za sugestie.

2

Jeśli to mają być strony statyczne / HTML+CSS+JS to za dużo chyba kombinujesz.
Lepiej dobrze napisz te HTML-e (title, H1, semantyka, robots.txt, sitemap).

generator do robots.txt (jeden z wielu): http://www.robotsgenerator.com/
generator do sitemap: http://www.xml-sitemaps.com/
jak opublikować sitemap: https://support.google.com/webmasters/answer/183669?hl=en

Generatory stron statycznych (przyda się np. gdy chcesz zmienić stopkę lub nagłówek na każdej stronie)

0
vpiotr napisał(a)

Jeśli to mają być strony statyczne / HTML+CSS+JS to za dużo chyba kombinujesz.

Bez JS - tylko pliki HTML i CSS; Dlaczego? Bo JS nie znam, a strona tak prosta, jak tylko się to da; HTML i CSS znam średnio, ale nie przeszkodziło mi to w przygotowaniu sobie tej strony; Google zawsze chętnie pomaga, więc i w tym przypadku nie było inaczej;

vpiotr napisał(a)

Generatory stron statycznych (przyda się np. gdy chcesz zmienić stopkę lub nagłówek na każdej stronie)

Stron nie jest aż tak dużo; Jeśli będę potrzebował zmienić coś na każdej stronie - w Notepad++ nie potrwa to dłużej niż 5 minut; Zmieniałem już na wszystkich stronach linki do zasobów z katalogu global i trwało to dosłownie kilka minut;

Ale dzięki za linki; Czytam właśnie o tych mapach stron - tego nie znałem;


Edit: Mapa strony wrzucona na serwer, plik robots.txt także przygotowany; Dziękuję za informacje.

1 użytkowników online, w tym zalogowanych: 0, gości: 1