Šta je novo?

.htaccess i rewrite rule

BelThaZoR

Čuven
Učlanjen(a)
13.04.2006
Poruke
814
Poena
680
Na kućnom wamp serveru sva pravila rade kako treba, međutim kad stavim online dobijam grešku 500 stalno. Nisam ranije radio sa rewriteom tako da kapiram da postoji jednostavniji način da se ovo uradi. Ako neko može da pomogne hvala. Evo kako izgleda .htaccess fajl

Evo linka ka mom serveru na kome rewrite funkcioniše: http://thebelthazor.dyndns.org/skyhighsim

Kod:
# Turn on the rewrite engine
Options +FollowSymLinks
RewriteEngine  on
RewriteCond %{REQUEST_FILENAME} !-f
# If the request doesn't end in a slash continue processing the rules
RewriteCond %{REQUEST_URI} [^/]$

#main menu
RewriteRule   ^about-us$  aboutus.php
RewriteRule   ^faq$  faq.php
RewriteRule   ^contact-us$  contactus.php
RewriteRule   ^support$  support.php

#online shop
RewriteRule   ^shop.skyhighsim.com$  http://secure.simmarket.com/skyhighsim.mhtml
RewriteRule   ^shop/payment-info$  payment.php

RewriteRule   ^shop.skyhighsim.com/Belgrade-Airport-LYBE-4.0$  http://secure.simmarket.com/skihighsim-lybe-4.0-belgrade-nikola-tesla-airport.phtml
RewriteRule   ^shop.skyhighsim.com/Tivat-Airport-LYTV-2010$  http://secure.simmarket.com/skyhighsim-tivat-2010.phtml
RewriteRule   ^shop.skyhighsim.com/Split-Airport-LDSP-2011$  products.php?pid=ldsp2011
RewriteRule   ^shop.skyhighsim.com/Approaching-Tivat$  products.php?pid=lytvapp
RewriteRule   ^shop.skyhighsim.com/Osjek-2011$  products.php?pid=ldos2011
RewriteRule   ^shop.skyhighsim.com/Charts-Viewer-Gauge$  http://secure.simmarket.com/skyhighsim-charts-viewer-gauge.phtml

#media
RewriteRule   ^media/request-a-review-copy$  requestcopy.php
RewriteRule   ^media/reviews-and-awards$  reviews.php
RewriteRule   ^media/news-archive$  news.php?archive=1
RewriteRule   ^media/video-chanel$  http://www.youtube.com/SkyHighSim
RewriteRule   ^media/news/(.*)$ news.php?id=$1

#products
RewriteRule   ^products/Belgrade-Airport-LYBE-4.0$  products.php?pid=lybe40
RewriteRule   ^products/Tivat-Airport-LYTV-2010$  products.php?pid=lytv2010
RewriteRule   ^products/Belgrade-Airport-LYBE-4.0-for-XPlane$  products.php?pid=lybe40xp9
RewriteRule   ^products/Split-Airport-LDSP-2011$  products.php?pid=ldsp2011
RewriteRule   ^products/Approaching-Tivat$  products.php?pid=lytvapp
RewriteRule   ^products/Osjek-Airport-2011$  products.php?pid=ldos2011
RewriteRule   ^products/Charts-Viewer-Gauge$  products.php?pid=chvg
RewriteRule   ^products/Novi-Sad-Čenej-LYNS-Airport-2009$  products.php?pid=lyns2009 [L]
 
Poslednja izmena:
Imaš već temu o mod_rewrite-u. 🙂

Prvo, jedan ili više uzastopnih RewriteCond-ova važe samo za jedan RewriteRule, znači mod_rewrite će proveriti uslov samo za prvu RewriteRule direktivu. Zato stavi na početak ovo:

RewriteCond %{REQUEST_FILENAME} -f [OR]
RewriteCond %{REQUEST_URI} /$
RewriteRule ^.*$ - [L]

Ovo znači da ako jeste fajl ili ako se završava sa / stopiraj rewrite i ne obrađuj ostale Rule-ove. To jest slovo L možeš staviti u bilo koji Rule, ne samo u poslednji, ako hoćeš da stopiraš obradu ostalih Rule-ova, ako se Rule koji ima L poklopi.

Tako da bih ti savetovao da staviš [L] na sve Rule-ove, verovatno će se performanse poboljšati, a takođe bi mogao da izmeniš redosled Rule-ova, tako da staviš na početak ona za stranice koje imaju najviše hit-ova (to jest da ih poređaš po redu opadajuće tražnje 😀)

Znači uradi to za početak, pa ćemo videti da li će greška nestati. 500 je interna serverska greška, moguće da dolazi do beskonačne petlje rewrite-ova na neki način, recimo među prvih par Rule-ova.

EDIT: Takođe u onim Rule-ovima gde se radi redirekcija na drugi domen sajt moraš da staviš [R=301,L]. Server na kome je tvoj sajt ne može tiho da isporuči tu stranicu jer je on nema. R=301 označava da će server poslati browser-u header sa brojem 301 i adresom na drugom sajtu i browser će sam otići na drugi sajt.


p.s I za kraj jedan generalan savet, treba biti što precizniji u regularnom izrazu za Rule (bolje performanse), tako da je OK da stavljaš ovako cele adrese. Takođe bi mogao malo da izmeniš

RewriteRule media/news/(.*)

Zvezdica slamjuje performanse. Ako ti je ID običan ceo broj možeš da staviš

RewriteRule media/news/([1-9][0-9]{0,6})

Ovo znači svi brojevi sa minimum jednom cifrom koja može biti 1-9 i još 0 do 6 cifara koje mogu biti 0-9 (ti ivu 6-icu možeš da prmeniš u skladu sa svojim potrebama, ovde 6-ica znači da max 7-cifreni brojevi, mogao bi to recimo da smanjih na 5 ili 4 za 6-cifrene i 5-cifrene brojeve respektivno, ili možda još niže)
 
Poslednja izmena:
Sve je proradilo kad sam skinuo htaccess fajl koji već postoji na sajtu i onda krenuo da u njemu menjam. Verovatno ima neke veze oko encodinga ili tako nešto. Uglavnom evo kako na je na kraju ispalo.

Kod:
RewriteEngine on
RewriteCond %{HTTP_HOST} !^skyhighsim\.com$
RewriteCond %{HTTP_HOST} !^www\.skyhighsim\.com$
RewriteRule ^.*$ - [L]

RewriteCond %{REQUEST_FILENAME} -f [OR]
RewriteCond %{REQUEST_URI} /$
RewriteRule ^.*$ - [L]

#Products
RewriteRule ^products\/Tivat\-Airport\-LYTV\-2010$ "products\.php\?pid\=lytv2010" [L]
RewriteRule ^products\/Belgrade\-Airport\-LYBE\-4\.0\-for\-XPlane$ "products\.php\?pid\=lybe40xp9" [L]
RewriteRule ^products\/Belgrade\-Airport\-LYBE\-4\.0$ "products\.php\?pid\=lybe40" [L]
RewriteRule ^products\/Split\-Airport\-LDSP\-2011$ "products\.php\?pid\=ldsp2011" [L]
RewriteRule ^products\/Approaching\-Tivat$ "products\.php\?pid\=lytvapp" [L]
RewriteRule ^products\/Osjek\-2011$ "products\.php\?pid\=ldos2011" [L]
RewriteRule ^products\/Charts\-Viewer\-Gauge$ "products\.php\?pid\=chvg" [L]
RewriteRule ^products\/Novi\-Sad\-Cenej\-LYNS\-Airport\-2009$ "products\.php\?pid\=lyns2009" [L]


#Main menu
RewriteRule ^about\-us$  "aboutus.php" [L]
RewriteRule ^faq$  "faq.php" [L]
RewriteRule ^contact\-us$  "contactus.php" [L]
RewriteRule ^support$  "support.php" [L]

#shop
RewriteRule ^shop/payment\-info$  "payment.php" [L]

#media
RewriteRule ^media/request\-a\-review\-copy$  "requestcopy.php" [L]
RewriteRule ^media/reviews\-and\-awards$  "reviews.php" [L]
RewriteRule ^media/news/archive$  "news.php?archive=1" [L]
RewriteRule ^media/news/([1-9][0-9]{0,6})$ "news.php?id=$1" [L]
 
I za kraj dodaj ispod RewriteEngine On direktive sledeće:

RewriteOptions MaxRedirects=1

mod_rewrite funkcioniše tako što ide kroz listu Rule-ova i ako se neki poklopi proverava Cond uz taj Rule (ako ga ima). Ako i to prođe onda radi rewrite i ako Rule nema [L] ide dalje kroz ostale Ruleove na isti način ali sa novom rewritovanom adresom. Kad dođe do kraja kreće od početka ponovo da proverava Rule-ove (to jest radi unutrašnju redirekciju, server se ponaša kao da je dobio novi zahtev i mod_rewrite ga ponovo obrađuje). Samo kada zaključi da ni jedan Rule ni Cond ne prihvata onda završava i prosleđuje adresu serveru na izvršavanje. E sad ja nisam siguran šta tačno radi ona crta (RewriteRule ^.*$ - [L]), znam da ona znači da se ne redi rewrite i da znači da da taj Rule prolazi, ali ne znam da li to znači da prolazi kao i svaki drugi rule (u smislu da će mod_rewrite ponovo krenuti iz početka, tj uraditi unutrašnju redirekciju) ili je to oznaka da se proces prekida. Zato za svaki sličaj stavi ovo što sam napisao. To će ograničiti mod_rewrite na max 1 unutrašnju redirekciju po jednom spoljšnjem zahtevu, a ta jedna je potrebna da bi se rewrite uopšte uradio.

I ne moraš da escape-uješ crtice ni sleševe ( - , / ). Crta znači nešto kad je u kockastoj zagradi (u ovom slučaju u rule-u media/news/([1-9][0-9]{0,6}) crta vrši tu ulogu i tu ne treba da se eskejpuje) van njih nema ulogu, a sleš ne znači ništa specijalno u regularnim izrazima, to je samo običan karakter.


p.s. Vidim da si sklonio redirekcije na druge sajtove, verovatno si onda izmenio linkove na sajtu. Tako i treba. 🙂
 
Poslednja izmena:
Oks. Hvala u svakom slučaju. Da li je moguće da fajl nije mogao da se pročita zbog razlike u oznakama novog reda u windowsu gde je pisan originalni htaccess i Unixa?
 
Oks. Hvala u svakom slučaju. Da li je moguće da fajl nije mogao da se pročita zbog razlike u oznakama novog reda u windowsu gde je pisan originalni htaccess i Unixa?

Moguce, naravno - snimanje .htacces fajla iskljucivo u Unix modu..
 
Radi sad sve. Ja sam .htaccess kucao u notepad++ i znam da sam podesio na Unix EOL format. Bitno da radi sad sve. Pokušaću da provalim šta je bio problem u originalnom pošto se manje-više ne ralikuje od konačnog fajla. Sigurno ima neka začkoljica...
 
Razvio sam projekat sa mojom MVC arhikteturom. Sve radi super, ali imam jedno polje u kome sam nov, a to je .htaccess, pa se nadam da mi neko moze pomoci.

Imam ovakav URL: http://knjiskicrv.comoj.com/index.php?page=book&id=1

Voleo bih da se prikaze kao: http://knjiskicrv.comoj.com/book/id/1

Ili ovo: http://knjiskicrv.comoj.com/index.php?page=faq u ovo: http://knjiskicrv.comoj.com/faq

Ako nema page u query-ju (http://knjiskicrv.comoj.com/index.php), voleo bih da prikaze ovako: http://knjiskicrv.comoj.com/

Takodje, bez page-a u query-ju, (http://knjiskicrv.comoj.com/index.php?category=2), trebalo bi da prikaze ovo: http://knjiskicrv.comoj.com/category/2

Kao dugo, interesuje me kako bi server protumacio kucanje linka u adresni bar i kako bi on znao na koji osnovni url da se vrati i obradi ga?
Na primer, kucanje ove adrese: http://knjiskicrv.comoj.com/book/id/1 bi trebalo da omoguci odlazak na adresu http://knjiskicrv.comoj.com/index.php?page=book&id=1. Koliko sam ja video na netu, pravi se stalan link, ali mi nije jasno kako bi taj stalni link bio pamcen (ili to samo Google tako pamti kao staln link, nisam siguran).

U kratkoj crti, da li bi resenje ovakvog .htaccess omogucilo dvosmernu komunikaciju, od lepog url-a za ispis, do konverzije lepog url-a ka dugom url-u za obradu?
Hvala.
 
Poslednja izmena:
Opa, dok sam ja odugovlačio sa sastavljanjem Rewrite-ova (gledam Ramba na TV-u 🙂) vidim ti već sam sredio stvar. Svaka čast.

EDIT: Vidim da si imao problema sa slikama i da to rešavaš stavljanjem apsolutnih adresa slika. Samo ne moraš da pišeš ceo URL, dovoljno je da ostaviš deo od kose crte posle adrese sajta zajedno sa kosom crtom, ovako:

/images/books/blablabla

i to je dovoljno da reši problem, a smanji će količinu teksta koji se prenosi.
 
Poslednja izmena:
Nacin na koji sam resio stvar (u stvari jos uvek zavrsavam) je tako da sam napravio ruter u glavnom kontroleru za URI. Citam $_SERVER['URI'] i parsiram dinamicki imena promenljivih. A sa druge strane, ostavio sam funkciju url() koju sam od starta obavijao oko svake URL adrese (oko slika nisam, pa sad i njih resavam), u kojoj parsiram trenutni URL u zeljeni lepi.

A u .htaccess sam postavio da sav saobracaj ide na index.php.
 
RewriteBase /
RewriteRule ^book/id/([1-9][0-9]{0,2})$ /index.php?page=book&id=$1 [L]
RewriteRule ^category/([1-9])$ /index.php?category=$1 [L]
RewriteRule ^faq/?$ /index.php?page=faq [L]
RewriteRule ^basket/?$ /index.php?page=basket [L]
RewriteRule ^contact/?$ /index.php?page=contact [L]

Mislim da bi ovako nešto bilo OK. Ja sam kao ograničenje za book id stavio da prihvata samo 3-cifrene brojeve, ti izmeni u ono što ti odgovara, a za kategoriju sam stavio samo jednocifrene, nebi bilo loše da dok imaš samo 3 kategrije upišeš [1-3], pa povećavaš svaki put kad uvedeš nove kategorije, recimo [1-9][0-5]? označava samo borjeve od 1 do 15. Nauči dobro regularne izraze (regular expressions) jer je dobro biti što precizni u Rewrite naredbama)

A ti vidi da li je ovo manje ili više koda nego što imaš u PHP ruteru. Mislim da je najverovatnije da je manje.
 
Poslednja izmena:
@ivan90BG Jos jedno pitanje: Mozes li mi razjasniti zasto ovaj .htaccess ne radi na mom WAMP-u, a struktura na mom hardisku je ovakva: /wamp/www/knjiski_crv/public_html/index.php i on se nalazi u istom folderu kao ovaj jedni index.php-a

Kod:
#
Options +FollowSymLinks
#
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>

Inace ovo je podesavanje koje radi na internet hostu.
Operativni sistem na mom kompjuteru je Windows 7.
 
Ako je ovako podešen rewrite, ti u PHP kodu samo treba da proveriš da li postoji $_GET['page'] i učitaš kontroler tog imena ako postoji. Ili proveriš da li postoji category i ako postoji onda učitaš traženu kategoriju.

A odgovor na drugo pitanje je:

Kaži prvo šta ti je na kućnom serveru DocumentRoot i da li ti se taj sajt nalazi u podfolderu DocumentRoot-a?

Ako se nalazi u podfolderu onda napiši RewriteBase /podfolder (naravno zameni sa pravim nazivom) i .htaccess file stavi u taj podfolder

I šta ti je to public_html, jel ti /wamp/www/knjiski_crv glavni folder u kome se nalazi ceo sajt, a public_html folder gde se nalazi index.php i ostale skripte, i dali sajtu pristupaš na http://localhost/knjiski_crv? Ako je sve tako onda na svaki RewriteRule moraš da dodaš još i public_html, a na RewriteBase doadjes knjiski_crv, tako da izgledaju ovako:

RewriteBase /knjiski_crv
RewriteRule ^neki-uslov$ public_html/index.php?blablabla [L]

EDIT:

Jedna ispravka mog prethodnog posta, poslednja tri navedena Rula možeš da spojiš u jedan:

RewriteRule ^(faq|basket|contact)/?$ /index.php?page=$1 [L]

A ono što sam rekao da [1-9][0-5]? označava brojeve od 1 do 15 nije tačno. Sledeći kod radi to: ([1-9]|1[0-5])

Jedan koristan link: http://www.easymodrewrite.com/
 
Poslednja izmena:
Ok, hvala na odgovoru.

/wamp/www/knjiski_crv - je glavni folder, u njemu imam folder public_html u kome se nalazi index.php, folderi sa JS skriptama, CSS stilovima i slikama.

U /wamp/www/knjiski_crv imam (pored public_html foldera) i foldere sa kontrolerima, modelima i vjuverima, koje bih voleo da sakrijem. Sad na kucnom kompjuteru mi se vidi cela putanja u brauzeru: http://localhost/knjiski_crv/public_html/, a voleo bih da se vidi samo: http://localhost/knjiski_crv/ (a da ovaj link ucita /wamp/www/knjiski_crv/public_html/ i da onaj moj .htaccess sa internet hosta radi i na lokalnom kompjuteru, tako da ne moram da imam dva razlicita .htaccess; inace .htaccess sam stavio u folder /public_html/ na internet hostingu i on radi, a planiram da ga stavim i na lokalu u /public_html/).

Moram ti priznati da sam ja pocetnik sa Apachom, pa ne znam gde bih mogao da trazim sta (DocumentRoot, na primer), pa bih te zamolio za malo upustvo.
 
E slušaj ovako, pustio sam problem da prenoći i došao do zaključka da jednostavno ne možeš da imaš baš iste .htaccess fajlove i na serveru i kod kuće (zato što je sajt na serveru u DocumentRoot folderu, a kod kuće u podfolderu). I preporučujem ti dok ne naučiš mod rewrite da se držiš PHP rutiranja. If it aint broke don't fix it.
 
Poslednja izmena:
Nazad
Vrh Dno