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) ?
devnul
22.04.2006, 18:06:55
Kod
RewriteRule ^(.+) $1.php [L]
e0d9
22.04.2006, 18:28:43
Niestety nie działa.
"Internal Server Error"
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]
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").
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.
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".
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.
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.
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
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:
Apache mod_rewritepozdr.
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
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.
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ń
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
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
e0d9
23.04.2006, 20:14:54
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

EDIT:
A jednak, nie idealne

Zamiast wyswietlac 404, przy podaniu blednej strony wyswietla sie blad 500 "internal server error"
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? ;)
e0d9
23.04.2006, 20:47:35
oczywiscie ze istnieje.
siemakuba
23.04.2006, 20:55:37
Hmmm.... w takim razie problem musi leżeć gdzie indziej, np tu:
źródło:
Apache manualCytat
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
23.04.2006, 21:01:41
W pliku http.conf wstawilem dwie podane przez ciebie linie. Niestety nie pomoglo.
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.
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
e0d9
24.04.2006, 14:32:37
siemakuba, ja w ogole na serwerze nie mam pliku http.conf
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.
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.
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.
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.
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
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?
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ś).
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.