Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> Zamiast /index.php?page=contact - /contact, RewriteRule?
Apocalyptiq
post
Post #1





Grupa: Zarejestrowani
Postów: 230
Pomógł: 3
Dołączył: 8.01.2008

Ostrzeżenie: (10%)
X----


Często na stronach internetowych spotykam się z takimi adresami podstron: site.com/contact. Jak takie coś najprościej uzyskać? Robi się to korzystając z RewriteRule? I czy nie ma jakichś przeciwwskazań co do stosowania czegoś takiego?

Ten post edytował Apocalyptiq 20.11.2008, 20:43:46
Go to the top of the page
+Quote Post
marcio
post
Post #2





Grupa: Zarejestrowani
Postów: 2 291
Pomógł: 156
Dołączył: 23.09.2007
Skąd: ITALY-MILAN

Ostrzeżenie: (10%)
X----


Tak jest to mod_rewrite a przeciwskazania sa do uzywania get'ow (IMG:http://forum.php.pl/style_emoticons/default/biggrin.gif)
Go to the top of the page
+Quote Post
Apocalyptiq
post
Post #3





Grupa: Zarejestrowani
Postów: 230
Pomógł: 3
Dołączył: 8.01.2008

Ostrzeżenie: (10%)
X----


Nie wiem czy ja robie coś nie tak, czy xampp (serwer dla linuxa) nie obsługuje mod_rewrite:
Kod
RewriteEngine on
RewriteRule ^(.*)$ /siatka/index.php?page=$1

Mam w głównym katalogu folder "siatka", i chcę np. adres localhost/siatka/index.php?page=team zmienić na localhost/siatka/team, ale powyższy kod mi nie działa (wpisałem to w plik .htaccess i umieściłem go w głównym katalogu). Jak powinien wyglądać dobry RewriteRule dla sytuacji, którą opisałem?

Dałem
Kod
RewriteEngine on
RewriteRule http://localhost/siatka/^(.*)$  http://localhost/siatka/index.php?page=$1

I też nie działa... Co robię nie tak?

Sprawdziłem ustawienia xamppa, no i jest tam włączony mod_rewrite, więc to nie jego wina... Jak powinien wyglądać dobry RewriteRule?
Go to the top of the page
+Quote Post
sowiq
post
Post #4





Grupa: Zarejestrowani
Postów: 1 890
Pomógł: 339
Dołączył: 14.12.2006
Skąd: Warszawa

Ostrzeżenie: (0%)
-----


Zdefiniuj najpierw pojęcie Nie działa.

Jeśli wrzuciłeś plik .htaccess do katalogu /siatka, i wywołujesz /siatka/cokolwiek, to jak dla mnie powinno zadziałać to, co napisałeś. Sprawdź jeszcze raz konfigurację serwera.

[edit]
Spróbuj tak:
Kod
RewriteRule ^(.*)$ index.php?page=$1 [L]

Wywołanie:
Kod
http://localhost/siatka/cokolwiek
Plik .htaccess w katalogu /siatka.

Ten post edytował sowiq 20.11.2008, 22:19:05
Go to the top of the page
+Quote Post
Apocalyptiq
post
Post #5





Grupa: Zarejestrowani
Postów: 230
Pomógł: 3
Dołączył: 8.01.2008

Ostrzeżenie: (10%)
X----


Zadziałało - przedtem plik .htaccess wrzuciłem do głównego katalogu, myślałem że tylko tam działa (IMG:http://forum.php.pl/style_emoticons/default/smile.gif) Tylko że mam jeszcze mały problem - jak sprawdziłem w firebugu, zawartość pliku style.css = zawartość aktualnej podstrony :| Pewnie to coś nie tak ze ścieżkami, powinienem dać sobie z tym rade (IMG:http://forum.php.pl/style_emoticons/default/winksmiley.jpg) Dzięki sowiq za pomoc! : )

Przy takim RewriteRule:
Kod
RewriteRule ^(.*)$ index.php?page=$1 [NC]

Przy adresie http://localhost/siatka/team zawartość zmiennej $_GET['page']=index.php... Dlaczego?



Troche info z $_SERVER:
Kod
[SCRIPT_FILENAME] => /opt/lampp/htdocs/siatka/index.php     [REMOTE_PORT] => 45159     [REDIRECT_QUERY_STRING] => page=team     [REDIRECT_URL] => /siatka/team     [GATEWAY_INTERFACE] => CGI/1.1     [SERVER_PROTOCOL] => HTTP/1.1     [REQUEST_METHOD] => GET     [QUERY_STRING] => page=index.php     [REQUEST_URI] => /siatka/team     [SCRIPT_NAME] => /siatka/index.php     [PHP_SELF] => /siatka/index.php


Ten post edytował Apocalyptiq 20.11.2008, 23:08:37
Go to the top of the page
+Quote Post
bronchos
post
Post #6





Grupa: Zarejestrowani
Postów: 25
Pomógł: 0
Dołączył: 16.03.2007

Ostrzeżenie: (0%)
-----


Zobacz tak...

Kod
   RewriteEngine On
   RewriteBase /
   RewriteCond %{REQUEST_FILENAME} !-f
   RewriteCond %{REQUEST_FILENAME} !-d
   RewriteRule (.*) /index.php?page=$1 [L,QSA]
Go to the top of the page
+Quote Post
Apocalyptiq
post
Post #7





Grupa: Zarejestrowani
Postów: 230
Pomógł: 3
Dołączył: 8.01.2008

Ostrzeżenie: (10%)
X----


Nie znajduje takiej strony:
Cytat
Not Found
The requested URL /siatka/team was not found on this server.
Go to the top of the page
+Quote Post
bronchos
post
Post #8





Grupa: Zarejestrowani
Postów: 25
Pomógł: 0
Dołączył: 16.03.2007

Ostrzeżenie: (0%)
-----


.htaccess oczywiscie w /
Go to the top of the page
+Quote Post
Apocalyptiq
post
Post #9





Grupa: Zarejestrowani
Postów: 230
Pomógł: 3
Dołączył: 8.01.2008

Ostrzeżenie: (10%)
X----


Poprzednio .htaccess umieściłem w folderze siatka, ale teraz umieściłem w głównym i też nie działa.

DZIAŁA! Połączyłem sposób sowiq'a - .htaccess w folderze siatka, RewriteRule ^(.*)$ index.php?page=$1 [L], oraz RewriteCodition'y bronchos'a, teraz całość wygląda tak:
Kod
RewriteEngine on
     RewriteCond %{REQUEST_FILENAME} !-f
     RewriteCond %{REQUEST_FILENAME} !-d
     RewriteRule ^(.*)$ index.php?page=$1 [L]

No i ten .htaccess znajduje się w folderze siatka.
Co do RewriteCond - jest to zabezpieczenie przed tym, żeby nie przerabiało adresów do istniejących plików (-f) i folderów (-d).
A co znaczy flaga [L] przy RewriteRule? Na stronie Apacha nie mogę tego znaleźć...
I niby nieco znam się na regex'ach, ale co znaczy znak dolara za ^(.*)? I znak "^" przed tym - w regex'ach kojarzy mi się on z wykluczaniem, ale chyba tylko w wyrażeniach w [].

Cytat
Anchors:
^ Start of line anchor
$ End of line anchor


Czyli stosuje się to do ograniczania tej pierwszej ścieżki? Z lewej i prawej, czyli w moim przypadku - wyjmuje to cały adres po siatka/. A jakby się tych kotwic nie dało, to jak byłby interpretowany (.*)?

Cytat
'last|L' (last rule)
Stop the rewriting process here and don't apply any more rewriting rules. This corresponds to the Perl last command or the break command from the C language. Use this flag to prevent the currently rewritten URL from being rewritten further by following rules. For example, use it to rewrite the root-path URL ('/') to a real one, e.g., '/e/www/'.

Czyli gdyby były jakieś inne RewriteRule'y, to to [L] zapobiegnie dalszym przeróbką danego adresu?

I jeszcze pytanie co do formularzy - jak mam np. formularz logowania, to dotąd miałem action="index.php?page=log". W tym log wykonywało się logowanie i przekierowywało na głowną. Zmiana na action="log" będzie ok (działa), czy może lepiej dać dla formularzy jakieś inne zasady? Np. pliki tylko wykonywujące coś, jak np. log, a nie będące podstroną, wsadzić w inny katalog i wywoływać je po staremu (np. inc/log.php)

Spotkałem się też z flagą [NC] - służy do tego, aby rozpoznawanie adresów nie było czułe na wielkość liter, może warto tą flagę też użyć (od strony pozycjonowania i wygody dla użytkownika)? Niby jak jest jakiś adres, to jest ok - chyba że ktoś skopiowałby adres i gdzieś zmienił na dużą literę np. jakąś jedną małą literę. Warto się w to bawić (bo i od strony przechwytywania $_GET['page'] trzebaby to przerobić)?

Aha, no i teraz trzebaby jakoś uporządkować linki na stronie - podawać teraz wszędzie adresy bezwzględne? Np. nie "log", tylko "http://esiatkarze.net/log"? Bo jeżeli np. będę na stronie http://esiatkarze.net/player/4, to jak będzie gdzieś link team, to mnie przekieruje chyba na http://esiatkarze.net/player/team a nie na http://esiatkarze.net/team? Czy może napisać jakąś funkcję, ustawiającą wszystkie url'e na stronie - ale wtedy, będąc na http://esiatkarze.net/player/4, względny adres do team musiałby wyglądać tak: "../team", tak? Lepiej bawić się w takie coś czy podawać wszędzie adresy bezwględne?

Znalazłem spoko artykuł o takim przepisywaniu adresu: http://www.northpole.pl/przyjazne-linki/

Wziąłem stamtąd rewrite dwupoziomowy:
Kod
RewriteEngine on
     DirectoryIndex index.php
     RewriteCond %{REQUEST_FILENAME} !-f
     RewriteCond %{REQUEST_FILENAME} !-d
     RewriteRule ^([a-zA-Z-_0-9]+)/([a-zA-Z-_0-9]+)/?$ ?page=$1&id=$2 [L]
     RewriteRule ^([a-zA-Z-_0-9]+)/?$ ?page=$1 [L]

Który ładnie działa, ale takie coś:
Kod
RewriteEngine on
       DirectoryIndex index.php
       RewriteCond %{REQUEST_FILENAME} !-f
       RewriteCond %{REQUEST_FILENAME} !-d
       RewriteRule ^([^/]+)/([^/]+)/?$ ?page=$1&id=$2 [L]
       RewriteRule ^([^/]+)/?$ ?page=$1 [L]

Już mi nie chce działać - wie może ktoś dlaczego? Zamieniłem [a-zA-Z-_0-9] na [^/] (wszystkie znaki oprócz slasha).






Wrzuciłem taki .htaccess na ovh (to darmowe konto, 60free):
Kod
RewriteEngine on
DirectoryIndex index.php
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^([a-zA-Z-_0-9]+)/([a-zA-Z-_0-9]+)/?$ ?page=$1&id=$2 [L]
RewriteRule ^([a-zA-Z-_0-9]+)/?$ ?page=$1 [L]

I na ovh wywala mi taki komunikat (przy normalnym adresie storny):
Cytat
The server encountered an internal error and was unable to complete your request

If you are owner of that account and you are looking for more information about Internal Server Error pleas visit http://60free.ovh.org/en/support/ or check if:

- attributes of file '/index.php' are 705,
- attributes of directory are 705,
- in '.htaccess' file there is no any unavailable entries

No i to "attributes of file '/' zmienia się, w zależności co się wpisze jako adres. Co jest nie tak z tym? Czy coś na ovh nie działa?
Adres do tej strony, na której umieściłem ten .htaccess: http://result.ovh.org/
Nadałem index.php - chomda 777, i tak nie działa.

Ten post edytował Apocalyptiq 26.11.2008, 19:43:15
Go to the top of the page
+Quote Post
erix
post
Post #10





Grupa: Moderatorzy
Postów: 15 467
Pomógł: 1451
Dołączył: 25.04.2005
Skąd: Szczebrzeszyn/Rzeszów




Cytat
A co znaczy flaga [L] przy RewriteRule? Na stronie Apacha nie mogę tego znaleźć...

Jest na pewno. (IMG:http://forum.php.pl/style_emoticons/default/tongue.gif)

Cytat
Czyli gdyby były jakieś inne RewriteRule'y, to to [L] zapobiegnie dalszym przeróbką danego adresu?

A widzisz, znalazłeś. (IMG:http://forum.php.pl/style_emoticons/default/smile.gif)

Cytat
podawać teraz wszędzie adresy bezwzględne?

Źle zrozumiałeś. Chodzi o to, aby w odwołaniach do adresów podawać linki bezwzględnie w ramach hosta, tj: zamiast np. url('.../gfx/img.jpg') podawać /gfx/img.jpg.

Cytat
Czyli gdyby były jakieś inne RewriteRule'y, to to [L] zapobiegnie dalszym przeróbkom danego adresu?

Tak.

Cytat
Niby jak jest jakiś adres, to jest ok - chyba że ktoś skopiowałby adres i gdzieś zmienił na dużą literę np. jakąś jedną małą literę. Warto się w to bawić (bo i od strony przechwytywania $_GET['page'] trzebaby to przerobić)?

Chyba nie; nie jestem pewien, czy np. google rozróżnia wielkość liter w adresach.

Cytat
Czyli stosuje się to do ograniczania tej pierwszej ścieżki? Z lewej i prawej, czyli w moim przypadku - wyjmuje to cały adres po siatka/. A jakby się tych kotwic nie dało, to jak byłby interpretowany (.*)?

Początek przetwarzanego wyrażenia i koniec. Np. /sciezka/plik/etc z $/^ będzie szukać w ramach całego wyrażenia. Bez operatorów, w dowolnej jego części.

Cytat
Już mi nie chce działać - wie może ktoś dlaczego? Zamieniłem [a-zA-Z-_0-9] na [^/] (wszystkie znaki oprócz slasha).

Wszystkie znaki oznaczała . (kropka). (Pisane z palca): ([.^/]+)
Go to the top of the page
+Quote Post
Apocalyptiq
post
Post #11





Grupa: Zarejestrowani
Postów: 230
Pomógł: 3
Dołączył: 8.01.2008

Ostrzeżenie: (10%)
X----


Takie coś:
Kod
RewriteEngine On
DirectoryIndex index.php
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^([.^/]+)/([.^/]+)/?$ ?page=$1&id=$2 [L]
RewriteRule ^([.^/]+)/?$ ?page=$1 [L]

Też nie działa. Mi się wydaje, że w [] nie było żadnej kropki - w nawiasie kwadratowym kropka po prostu oznacza znak kropki, dobrze pamiętam? A jeżeli chciało się jakiś zbiór tylko wykluczyć, to dawało się tylko na początku owego wyłączonego zbioru znak ^ (dosyć dawno uczyłem się wyrażeń regularnych, no ale chyba [^/] powinno działać, a nie działa, chyba że znak "/" jest znakiem zastrzeżonym w nawiasach kwadratowych? ale ten zwykle zastrzeżany slash jest w drugą stronę: "\").
Go to the top of the page
+Quote Post
sowiq
post
Post #12





Grupa: Zarejestrowani
Postów: 1 890
Pomógł: 339
Dołączył: 14.12.2006
Skąd: Warszawa

Ostrzeżenie: (0%)
-----


Jeśli się mylę, to mnie poprawcie.

[X] oznacza zbiór X
[^X] oznacza dopełnienie zbioru X, czyli wszystko oprócz tego zbioru
więc nie istnieje coś takiego jak [X^Y]. Jeżeli już, to [^Y].

W pasku adresu masz ograniczoną ilość możliwych znaków, a przynajmniej zdrowy rozsądek sugerowałby używanie ograniczonej ilości, czyli np.:
[A-Za-z0-9_,:\[\]\-\.]
Go to the top of the page
+Quote Post
erix
post
Post #13





Grupa: Moderatorzy
Postów: 15 467
Pomógł: 1451
Dołączył: 25.04.2005
Skąd: Szczebrzeszyn/Rzeszów




Cytat
Mi się wydaje, że w [] nie było żadnej kropki - w nawiasie kwadratowym kropka po prostu oznacza znak kropki, dobrze pamiętam?

To Cię pamięć zawodzi. (IMG:http://forum.php.pl/style_emoticons/default/winksmiley.jpg) http://www.regular-expressions.info/dot.html

A co do daszka, to w manualu jest:
Cytat
^
negate the class, but only if the first character

Tak więc wychodzi na to, że ~sowiq ma rację. (IMG:http://forum.php.pl/style_emoticons/default/winksmiley.jpg)

Ten post edytował erix 27.11.2008, 12:20:16
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
2 Użytkowników czyta ten temat (2 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 23.12.2025 - 21:12