Drukowana wersja tematu
Forum PHP.pl _ Serwery WWW _ [mod_rewrite] Jedno polecenie ...
Napisany przez: e0d9 22.04.2006, 17:23:11
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) ?
Napisany przez: devnul 22.04.2006, 18:06:55
Kod
RewriteRule ^(.+) $1.php [L]
Napisany przez: e0d9 22.04.2006, 18:28:43
Niestety nie działa.
"Internal Server Error"
Napisany przez: devnul 22.04.2006, 21:26:59
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]
Napisany przez: e0d9 22.04.2006, 21:34:56
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").
Napisany przez: devnul 22.04.2006, 21:43:07
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.
Napisany przez: e0d9 22.04.2006, 21:51:15
ok, dziala. Dzieki
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".
Napisany przez: devnul 22.04.2006, 21:55:10
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.
Napisany przez: e0d9 22.04.2006, 22:08:24
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.
Napisany przez: devnul 22.04.2006, 22:21:16
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
Napisany przez: siemakuba 22.04.2006, 22:36:53
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: http://httpd.apache.org/docs/1.3/mod/mod_rewrite.html
pozdr.
Napisany przez: devnul 22.04.2006, 22:47:00
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
Napisany przez: siemakuba 22.04.2006, 23:16:58
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.
Napisany przez: devnul 22.04.2006, 23:31:03
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ń
Napisany przez: siemakuba 23.04.2006, 00:04:54
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
Napisany przez: devnul 23.04.2006, 00:34:17
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
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
Napisany przez: siemakuba 23.04.2006, 20:46:33
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? ;)
Napisany przez: e0d9 23.04.2006, 20:47:35
oczywiscie ze istnieje.
Napisany przez: siemakuba 23.04.2006, 20:55:37
Hmmm.... w takim razie problem musi leżeć gdzie indziej, np tu:
źródło: http://httpd.apache.org/docs/1.3/mod/core.html#errordocument
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)
Napisany przez: e0d9 23.04.2006, 21:01:41
W pliku http.conf wstawilem dwie podane przez ciebie linie. Niestety nie pomoglo.
Napisany przez: siemakuba 23.04.2006, 21:17:26
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.
Napisany przez: devnul 23.04.2006, 23:30:46
Kod
ErrorDocument 500 http://localhost/error500.html
można prosciej - dodaj to pod wpisem o 404 i owinno smigac
Napisany przez: e0d9 24.04.2006, 14:32:37
siemakuba, ja w ogole na serwerze nie mam pliku http.conf
Napisany przez: siemakuba 24.04.2006, 14:54:37
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.
Napisany przez: e0d9 24.04.2006, 15:49:19
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.
Napisany przez: siemakuba 24.04.2006, 17:35:17
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.
Napisany przez: e0d9 24.04.2006, 18:28:43
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.
Napisany przez: devnul 24.04.2006, 19:57:17
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
Napisany przez: rybosom 14.09.2017, 17:46:23
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
czy $1 należy zmienić na coś innego?
Napisany przez: trueblue 14.09.2017, 18:03:19
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ś).
Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)