Drukowana wersja tematu

Kliknij tu, aby zobaczyć temat w orginalnym formacie

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 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".

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 winksmiley.jpg

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 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

Napisany przez: 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 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

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 winksmiley.jpg

Napisany przez: e0d9 24.04.2006, 14:32:37

siemakuba, ja w ogole na serwerze nie mam pliku http.conf blink.gif

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 tongue.gif

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 sad.gif

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)