Linki z mod_rewrite

0

Tak sobie pomyślałem, że by można nieco usprawnić działanie 4p od strony użytkownika i (co dość istotne) ułatwić indeksowanie robotom, w szczególności chodzi mi o GoogleBota.

Jak wiadomo, GoogleBot nie lubi stron z "?", "&" itp. w adresie i czasem potrafi takich nie zindeksować albo coś przy nich popsuć.
Inna rzecz, że takie linki są niezbyt ładne i czasami problematyczne w przekazywaniu np. przez różne komunikatory.

Rozwiązać to można w bardzo prosty sposób - przez mod_rewrite.
Standardowo jest w Apaczu, zwykle trzeba go tylko włączyć.
No, jeszcze jest potrzebny htaccess, ale to 4p ma z pewnością.

No i starczy tylko np. w głównym katalogu forum w .htaccess wstawić takie cuś:

RewriteRule ^/topic/([0-9]+)$ /viewtopic.php?id=$1

I to starczy, żeby po wpisaniu http://4programmers.net/Forum/topic/1234 efekt był taki sam, jakby ktoś wpisał http://4programmers.net/Forum/viewtopic.php?id=1234.
LInk jest krótszy, łatwiejszy do zapamiętania i indeksowalny dla robotów.
Poza tym, ci wszyscy cholerni "chakierzy" nawet nie będą znać prawdziwych nazw plików, a wpisanie zamiast numeru np. "abcd" nie wywali strony z błędem SQL, tylko 404. (Tak, wiem że można ściągnąć coyote - ale ci o których mowa są na to za głupi :))
Inny przykład, w głównym katalogu:

RewriteRule ^/faq/([0-9]+)$ /faq.php?id=$1
RewriteRule ^/faq/([0-9]+)/edit$ /faq_add.php?id=$1

Efekt: http://4programmers.net/faq/1234/edit włączy edycję wskazówki.

Pomysł chyba wart wprowadzenia, w szczególności że to nie będzie raczej nic trudnego.

0

Mi sie podoba, nawet bardzo. Moze wowczas daloby sie uzyc google, do przeszukiwania serwisu.
Nie bez znaczenia jest tez fakt, ze wowczas, 4p zapewne staloby sie bardziej popularne :)

0

No, sprawa jest niby prosta. Pozostaje jednak pozmienianie linkow w skorkach oraz skryptach...

0

No, sprawa jest niby prosta. Pozostaje jednak pozmienianie linkow w skorkach oraz skryptach...

Przepuścić przez sed'a? Ze skorkami nie byloby wielkiego problemu... ale w skryptach to trzeba bardziej uwazac :(

0

Przepuścić przez sed'a? Ze skorkami nie byloby wielkiego problemu... ale w skryptach to trzeba bardziej uwazac :(

No tak trzeba uwazac ale co szkodzi sprobowca :> Jakis mega replaceator i do dziela :> Jak bedzie dzialac to dobrze a jak nie to trudno i bedzie tak jak jest :)

0

Dla podanego wyzej przykladu wystarczyloby cos takiego:
sed 's:viewtopic\.php\?id=:topic/:g'

Ale te podane wyrazenia sa niewystarczajace. Zapytania sa bardziej zlozone. viewtopic moze miec takze parametr okreslajacy strone.
Jezeli ktos poda mi skladnie wszystkich zapytan, to w wolnych chwilach moge napisac skrypcik podmieniajacy.

I tutaj od razu pytanie: jaka skladnia powinna byc.
Bo: /topic/123 to troche za malo dla bardziej zlozonych. Jezeli mamy np:
viewtopic.php?id=123&p=1 to chyba powinnismy zastosowac cos w stylu:
/topic/id/123/p/1
ew.
/topic/123/1
Ale wowczas trzeba ustalic, jaka ma byc kolejnosc parametrow i co zrobic, jezeli takich brakuje.

0

Ustalenie kolejności (faktycznie rzecz potrzebna) najlepiej zrobić po prostu tak, żeby link wyglądał naturalnie - czyli np. właśnie topic/1234/3 dla trzeciej strony. A co do pustych - można po prostu topic/1234//cosjeszcze przy wyrażeniu regularnym z | i regółką na brak czegokolwiek, czyli:

RewriteRule /topic/([0-9]+)/([0-9]+|$)$/cosinnego /viewtopic.php?id=$1&p=$2&...

0

topic/1234//

To jest nieprawidlowy url :(
Poniewaz przy braku parametru przyjmowane jest domyslnie p=0, wiec nalezaloby wszystkie tego typu zamieniac na:
/1234/0/
Tak wiec wszystkie mozliwe linki poprosze tu wypisac...
Jak ktos ma u siebie zrodelka, to niech wykona w katalogu z pliczkami:
grep \? *php *tpl > wyniki.txt
I wrzuci tutaj wyniki. Moze nie bedzie to najlepszy wybor bajek, ale tez mozna poczytac ;)

0

Kolejny staroć, którego odświeżam bo uważam, iż jest to pomysł godny uwagi a został zapomniany...

W powyższych przykładach powstaje problem kolejności parametrów - na stronie http://era.pl zostało to bardzo ładnie rozwiązane - przykład:
http://era.pl/index.php/id=prasa_inf/press_id=603/zone=10/section=taktak
Więc i u nas mogłoby to być w ten sposób - wtedy kolejność nie ma znaczenia, a boty wyszukiwarek mogą pełzać po stronce i ją indeksować - wtedy można zrezygnować z naszej (niezbyt zaawansowanej) wyszukiwarki i zrobić taką, jaka jest na http://php.net - czyli odnoszącą się do http://google.pl z parametrem <font color="darkblue">site:4programmers.net</span>

0

No to do roboty.
Skrypty przepuścić trzeba przez sed-a z regułką:
{
s:&:/:g
s:.php?:.php/:g
}

Z RewriteRule mam na razie problemy, aby to w jednej regulce zmieścic :( Na razie czytam mana.

0

Nie pomyślałem o jednym... o ile dobrze wiem, to pliku .htaccess nie ma na IIS więc w tym momencie Coyote zrobi się Apache-only :( to nie będzie dobre... teraz elegancko chodzi na IIS.

Może zanim pojawią się zmiany należałoby się w jakoś sposób upewnić, że da się wykorzystać google do przeszukania całego serwisu po wprowadzeniu zmian?

Ja się niestety na tym nie znam...

0

Nie pomyślałem o jednym... o ile dobrze wiem, to pliku .htaccess nie ma na IIS

http://www.qwerksoft.com/products/iisrewrite/

//ups - dzięki za link ;) tylko taki problem, że to jest płatne :( - M

0

tylko taki problem, że to jest płatne :(

A IIS jest darmowy, prawda? ;)

//tak :P jest dołączony do systemu operacyjnego :P - M

0

Z RewriteRule mam na razie problemy, aby to w jednej regulce zmieścic :( Na razie czytam mana.

czemu akurat tylko w jednej?

0

Z RewriteRule mam na razie problemy, aby to w jednej regulce zmieścic :( Na razie czytam mana.

czemu akurat tylko w jednej?

Tzn. może być jedna, ale uniwrsalna. Na razie potrafie zrobić tylko takie typu:
(xxx=aaa)
(xxx=aaa)(yyy=bbb)
(xxx=aaa)(yyy=bbb)(zzz=ccc)
Tzn. nie wiem jak dla zmiennej liczby parametrów. Uzywajac sed-a nie mam takich problemow, bo i tak zamieniam tylko ? na / oraz & na /. RewriteRule musi zamieniac pierwsze / na ?, a pozostale (nie wiadomo ile) na & i to wlasnie jest problem (zwlaszcza, ze te regexp w apachu jakies dziwne mi sie wydaje :( )

0

Posiedziałem nad tym, poczytałem dokumentację, przykłady i doszedłem do jednego wniosku:
nie da się zrobić (jeżeli się mylę, niech ktoś mnie poprawi :)) jednej, uniwersalnej regułki ze względu na to o czym napisał Kuba: liczba argumentów/wartosci jest zmienna i pozostaje Jego rozwiązanie, lub to o czym ja myślę - nie stawiać na uniwersalność, tylko dla każdego skryptu pobierającego dane metodą GET zrobić oddzielny RewriteCond.
W swoich próbach stworzenia uniwersalnego Rewrite`a doszedłem jeszcze do takiego wyrażenia:
RewriteRule ^(.+)(/.+=.+){1,} $1?$2&$3
ale niestety $3 nie oznacza kolejnego powtórzenia (/.+=.+)
Może ktoś to wyrażenie jakoś wykorzysta :-|

0

Ja jeszcze popróbuję z flagami. Dzięki temu można regułki kilka razy wykonywać. Ale na razie nie mam czasu i pomysłu jak to zrobić.

0

To ja jeszcze zwrócę uwagę, że we wszystkich przykładach do każdego skryptu było po kilka RewriteRule, w zależności od ilości argumentów. Przydałoby się znać wszystkie linki jakie generuje kojot.

0

Przydałoby się znać wszystkie linki jakie generuje kojot.

True, true. Kto ma ochotę to zrobić? :>

0

a jednak w pseudo-uniwersalność polazłem ;P

Po drobnym omówieniu z Dryobates`em oto co mamy:

RewriteRule ([/]+.php)/([/]+=[/])/([/]+=[/])/([/]+=[/])/([/]+=[/])/$ /$1?$2&$3&$4&$5
RewriteRule ([/]+.php)/([/]+=[/])/([/]+=[/])/([/]+=[/])/$ /$1?$2&$3&$4
RewriteRule ([/]+.php)/([/]+=[/]
)/([/]+=[/])/$ /$1?$2&$3
RewriteRule ([/]+.php)/([/]+=[/]
)/$ /$1?$2

Rewrite zgodnie z tymi regułkami zamienia żądanie
/skrypt.php/arg1=val/arg2=val2/arg3=val3/
na
/skrypt.php?arg1=val&arg2=val2&arg3=val3

Jednak system ten ma jeden mankament: maksymalna liczba argumentów przysyłanych przez GET. Powyższe regułki pozwalają na maksymalnie 4 argumenty (można zwiększyć limit :)). Kojot chyba nigdzie nie używa więcej niż 4? Jeszcze jedna regułka:

RewriteRule ([/]+.php)/$ /$1

zamienia /skrypt.php/ na /skrypt.php (tak aby serwer się nie pogubił).

Teraz potrzeba kogoś kto przetestuje te regułki na działającym egzemplarzu ;)

przykładowy plik .htaccess, który należy umieścić w katalogu z kojotem:

RewriteEngine on
RewriteRule ([/]+.php)/([/]+=[/])/([/]+=[/])/([/]+=[/])/([/]+=[/])/$ /$1?$2&$3&$4&$5
RewriteRule ([/]+.php)/([/]+=[/])/([/]+=[/])/([/]+=[/])/$ /$1?$2&$3&$4
RewriteRule ([/]+.php)/([/]+=[/]
)/([/]+=[/])/$ /$1?$2&3
RewriteRule ([/]+.php)/([/]+=[/]
)/$ /$1?$2
RewriteRule ([/]+.php)/$ /$1

jeżeli używasz apache musisz mieć w danym katalogu ustawione AllowOverride FileInfo lub AllowOverride All ;)

1 użytkowników online, w tym zalogowanych: 0, gości: 1