Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [mod_rewrite] Jedno polecenie ...
Forum PHP.pl > Forum > Serwery WWW
e0d9
Witam

Mam pewien problem z mod_rewrite. Posiadam dosc rozbudowana strone ktora ma kilkadziesiat podstron. Kazda podstrona ma rozszerzenie php. Chcialbym aby ich adresy byly bez rozszerzenia. Probowalem zastosowac taka opcje:

RewriteEngine on
RewriteRule ^linkzamienny$ linkprawidlowy

I to dziala. Lecz niepozytywne byloby dodawanie RewriteRule dla kazdej podstrony. Czy istnieje mozliwosc za pomoca jednej linii zamienic wszystkie adresy podstron (po prostu odejmujac od nich rozszerzenie .php) ?
devnul
Kod
RewriteRule ^(.+) $1.php [L]
e0d9
Niestety nie działa.

"Internal Server Error"
devnul
hmm, cóż, tego wyżej nie testowałem, ale spróbuj tak, to już przetestowane i działa na 100%
Kod
RewriteEngine on

RewriteCond %{REQUEST_FILENAME} !(.*)\.php$ [NC]
RewriteRule ^(.+) $1.php [L]
e0d9
Owszem dziala, ale inaczej nizbym sie mogl spodziewac.

Teraz do adresu dodawane jest po prostu rozszerzenie .php. Powoduje to, ze wpisanie prawdziwego adresu (z rozszerzeniem) nie dziala oraz nie dziala index (bo jak wiadomo apache wyswietla z katalogu index.php, a po dodaniu w/w kodu przegladarka poszukuje "index.php.php").
devnul
widze ze nie testowałeś
Kod
RewriteCond %{REQUEST_FILENAME} !(.*)\.php$ [NC]

ta linia powoduje ze jeśli w adresie występuje już rozszezenie php to sprawdzanie linków i ich podmiana nie występuje. Po drugie to nie przeglądarka wyszukuje linków (index.php) bo równie dobrze w ustawieniach serwera mozesz sobie ustawić ze plikiem domyślnym ma być ala.ma.kota i to on zostanie zwrócony przeglądarce jeśli serwer nie zostanie poproszony o żaden inny plik. Pozatym reguła ta działą tylko jeśli podasz jakiś ciąg także w wypadku gdy nic nie zostanie podane (poza scierzką do katalogu w którym znajduje się folder z plikiem .htacces to nie wykona się żadna podmiana linków.
e0d9
ok, dziala. Dzieki smile.gif

Tylko jeszcze jedno pytanie.
Jak zrobic to samo z innymi rozszerzeniami (przykladowo gdy mam na serwerze php i html) ?

Gdy ponizej dodam linie:

RewriteCond %{REQUEST_FILENAME} !(.*)\.html$ [NC]
RewriteRule ^(.+) $1.html [L]

to wywala "internal server error".
devnul
Kod
RewriteEngine on

RewriteCond %{REQUEST_FILENAME} !(.*)\.(php|htm|html|jpg|jpeg|gif|png|zip|rar|doc|xls)$ [NC]
RewriteRule ^(.+) $1.php [L]

wszystko w nawiasie okrągłym to jakby tablica możliwych rozszerzeń, jej elementy są oddzielone od siebie pionowymi liniami.


/dopisane
Moduł mod_rewrite nie moze wiedzieć czy chodzi ci o plik html czy o php, dlatego najlepszym wyjściem jest zapisyanie wszystkich plików którym chcesz usunąć rozszerzenie (w taki sposóB) z rozszerzeniem php zamiast html - parser poprostu nie sparsuje go i tyle (bo nie bedzie tam kodu php)
inaczej się nie da w taki prosty sposób.
e0d9
Troche to "pogmatwane".

Podany przez ciebie sposob dziala, lecz ma pewna niedogodnosc.
W pierwszej lini musze podac wszystkie typy plikow jakie mam na stronie bo inaczej sie nie otwieraja.
Kiedy wpisze sciezke do jakiegos folderu, np. adres.pl/folder, to wyskakuje "No input file specified." pomimo ze mam w tym katalogu plik index.php.
devnul
wpisaną scierzkę zakończ slashem "/" i po kłopocie

//dopisane

zresztą nei ma rozwiązań idealnych - tymbardziej ze chcesz pójść na łatwizne zastosować jedno rozwiązanie do wszystkich podstron - wóz albo przewóz - wybór należy do Ciebie winksmiley.jpg
siemakuba
Cytat
W pierwszej lini musze podac wszystkie typy plikow jakie mam na stronie bo inaczej sie nie otwieraja.


Jezeli chcesz aby wszystkie istniejace pliki otwieraly sie normalnie dodaj przed RewriteRule cos takiego:

Kod
RewriteCond    %{REQUEST_FILENAME} !-d
RewriteCond    %{REQUEST_FILENAME} !-s


To spowoduje, ze reguly beda stosowane tylko do:
-d - istniejacych katalogow o rozmiarze wiekszym niz 0
-s - istniejacych plikow o rozmiarze wiekszym niz 0

vide: Apache mod_rewrite

pozdr.
devnul
widze ze nie czytałeś tematu. Kolega chgce ukrywac rozszerzenia ale tylko wybranych plików a reszte zostawić w spokoju, dodatkowo nie chce definiować nazw tych plików, więc to moze byc wszystko i w dowolnie głębokim katalogu, więc jakoś nie widze tu zastosowania dla sposobu podanego przez Ciebie
siemakuba
owszem, czytałem temat. Nie napisałem przeciez: "Zrob tak i bedzie wszystko działac tak jak chcesz". Bardziej moim zamyslem bylo pokazanie co mozna zastosowac dodatkowo aby wypracowana przez was metoda byla skuteczniejsza.

Kod
# zajmij sie tylko wywolaniami do nieistniejacych plikow/katalogow

RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-s [OR]

# a jesli istnieja to tylko tymi z nastepujacym rozszerzeniem

RewriteCond %{REQUEST_FILENAME} !(.*)\.(php|htm|html)$ [NC]

RewriteRule ^(.+) $1.php [L]


razem polaczone da to taki efekt, ze mozesz ukryc rozszerzenia wybranych plikow, np. *.php, *.html, *.html, a pozostale istniejace pliki beda wyswietlane normalnie.

http://localhost/moja_strona.html -> pasuje, przetlumaczone na moja_strona.php
http://localhost/moje_style.css -> nie pasuje, pokaz norlmalnie.

popraw mnie, jezeli sie myle.
pozdr.
devnul
Cytat
http://localhost/moja_strona.html -> pasuje, przetlumaczone na moja_strona.php
jak rozumiem to ten plik nie istnieje na serwerze, więc zwróciłoby błąd 404 z racji tego ze moja część kodu nie interpretuje dalej jeśli rozszerzenie pliku konczy się na któreś wyrażeń
siemakuba
Cytat
Cytat
http://localhost/moja_strona.html -> pasuje, przetlumaczone na moja_strona.php

jak rozumiem to ten plik nie istnieje na serwerze, więc zwróciłoby błąd 404 z racji tego ze moja część kodu nie interpretuje dalej jeśli rozszerzenie pliku konczy się na któreś wyrażeń


Racja, to nie byl najlepszy przyklad :)
Bedzie dzialac dla istniejacego pliku *.html, zosatnie on poprostu wyswietlony.

Skoro chodzi o ukrycie rozszerzen, to taki przyklad bedzie lepszy:

http://localhost/moja_strona -> tlumaczone na moja_strona.php
http://localhost/obrazek.jpg -> jezeli istnieje, pokazywany
devnul
no to tak zbiore do "kupy" i dodam od siebie jeszcze jedną rzecz, która przyda się podczas gdy ktoś się pomyli i poda zły link winksmiley.jpg
Kod
# zajmij sie tylko wywolaniami do nieistniejacych plikow/katalogow
ErrorDocument 404 http://localhost/error404.html

RewriteEngine on

RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-s [OR]

# a jesli istnieja to tylko tymi z nastepujacym rozszerzeniem

RewriteCond %{REQUEST_FILENAME} !(.*)\.(php|htm|html)$ [NC]

RewriteRule ^(.+) $1.php [L]

oczywiście plik error404.html musi istnieć zeby mógł byc wyświetlony smile.gif
e0d9
O to mi wlasnie chodzilo !

Teraz jest wysmienicie ! Strony dzialaja zarowno z rozszerzeniem jak i bez niego. Mozna tez odwolywac sie do katalogow. Dzieki.

P.S. A jednak- rozwiazanie idealne smile.gif

EDIT:

A jednak, nie idealne smile.gif
Zamiast wyswietlac 404, przy podaniu blednej strony wyswietla sie blad 500 "internal server error" sad.gif
siemakuba
Cytat(devnul @ 2006-04-23 00:34:17)
oczywiście plik error404.html musi istnieć zeby mógł byc wyświetlony :)

oczywiscie plik error404.html istnieje? ;)
e0d9
oczywiscie ze istnieje.
siemakuba
Hmmm.... w takim razie problem musi leżeć gdzie indziej, np tu:

źródło: Apache manual
Cytat
ErrorDocument directive
Override: FileInfo


Sprawdz czy masz ustawione Override: FileInfo (lub All) w http.conf
A) Directory
B) VirtualHost
na katalog w ktorym masz strone (tam gdzie .htaccess)
e0d9
W pliku http.conf wstawilem dwie podane przez ciebie linie. Niestety nie pomoglo.
siemakuba
poczkaj :) sie nie zrozumieliśmy się :)

1. wywal to co wstawiłeś z httpd.conf

2. poszukaj lini:
Kod
<Directory "E:/www root">

zamiast "E:/www root" bedzie ofkors twoja sciezka do glownego katalogu serwera (tego widocznego jako http://localhost/

3. wewnatrz dyrektywy <Directory> bedziesz mial linie zaczynajaca sie od
Kod
AllowOverride


4. wazne jest to co masz za AllowOverride
- jezeli nie All i nie ma tam FileInfo, dopisz FileInfo
- jezeli nie All i jest FileInfo lub All... nie mam pomyslu co moze byc przyczyna

pozdr.
devnul
Kod
ErrorDocument 500 http://localhost/error500.html

można prosciej - dodaj to pod wpisem o 404 i owinno smigac winksmiley.jpg
e0d9
siemakuba, ja w ogole na serwerze nie mam pliku http.conf blink.gif
siemakuba
To jest twój serwer lokalny, tak?

W katalogu w którym zainstalowałeś Apache masz katalog conf, w katalogu conf masz plik httpd.conf.

To jest główny plik konfiguracji całego serwera, wiec umieszczenie go w katalogu w ktorym masz .htaccess (bo rozumiem ze tak zrobiles) nic nie da.

P.S. swoja droga, moglbys sie wykazac wieksza inicjatywa, uzywajac chociazby magicznego skrótu Win+F. :)

pozdr.
e0d9
Nie, mam wykupiony serwer wirtualny. Na poczatku w katalogu glownym nie mialem zadnego z omawianych plikow. Stworzylem plik .htaccess bo chcialem miec domyslnie php5. Pliku http.conf nigdzie nie mam.
siemakuba
okej, skoro tak, to jedyne zmiany / ustawienia jakie dokonasz mozesz dokonac w pliku .htaccess.

Chwilowo nie mam pomyslu co moze pomoc.. Moze wrzuc caly .htaccess tutaj? Zajrze wieczorem i pobadamy :)

Rozumiem, ze wszystko smiga jak nalezy, jedynie problem jest z plikiem error404.html?
Moze byc (i prawdopodonie jest) ze na serwerze masz zablokowana mozliwosc edycji tego wpisu.

pozdr.
e0d9
Ok, to jest moj plik .htaccess:

Kod
Action application/x-httpd-php5 "/cgi-sys/php5"
AddType application/x-httpd-php5 .php

ErrorDocument 404 http://adres_mojej_strony/404.shtml

RewriteEngine on

RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-s [OR]

RewriteCond %{REQUEST_FILENAME} !(.*)\.(php|htm|html)$ [NC]

RewriteRule ^(.+) $1.php [L]


Wszystko smiga jak nalezy. Jedyny problem jest taki, ze przy wpisaniu zlego adresu podstrony ( http://adres_mojej_strony/nieistniejaca_podstrona.html ) zamiast bledu 404, serwer wywala 500 (internal server error).

Jesli chodzi o zablokowana edycje wpisu, to odpada. Testowalem rozne rzeczy z 'ErrorDocument" i zawsze smigalo.
devnul
Kod
RewriteEngine on
Action application/x-httpd-php5 "/cgi-sys/php5"
AddType application/x-httpd-php5 .php
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-s [OR]
RewriteCond %{REQUEST_FILENAME} !(.*)\.(php|htm|html)$ [NC]
RewriteRule ^(.+) $1.php

RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.+) error404.html [R]


Powinno działać. Troche to oszukiwanie ale liczy się efekt tongue.gif
rybosom
mój plik .htaccess do przekierowania na https

RewriteEngine On
RewriteCond %{SERVER_PORT} 80
RewriteRule ^(.*)$ https://www.adres.pl/$1 [NC]

i niby wszystko OK, zmienia www.adres.pl na https://www.adres.pl ale np adresów www.adres.pl/regulamin/index.php www.adres.pl/mail/index.php itd nie znajduje sad.gif

czy $1 należy zmienić na coś innego?
trueblue
A pliki w tych lokalizacjach fizycznie istnieją?
Jeśli nie, to najpewniej Twój .htaccess jest okrojony (nie pokazałeś całego, obciąłeś coś).
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.