Autor Zpráva
peteo
Profil
dobrý deň, večer, ráno,

bojujem s revrite a stále neúspešne.

preto teda pekne prosím o pomoc, možno tomu porozunmiem, keď to uvidím polopaticky.

jedná sa o to, že niektoré externé odkazy smerujúce na stránku vyzerajú takto:

http://co-to-je.sk/spresne.php%3Fdotaz%3DBelohorcov%25C3%25A1,%2520Zuzana

a stránky vyhodia error404.

odkaz by mal vyzerať

http://co-to-je.sk/spresne.php?dotaz=Belohorcov%C3%A1,%20Zuzana

resp.

http://co-to-je.sk/spresne.php?dotaz=Belohorcová, Zuzana

jedná sa mi najmä o zmenu sekvencie

... ?dotaz=...

za php, kde je nesprávne vyhodnocovaná.

môžete mi, prosím, ukázať, ako by malo byť v .htaccess ošetrené? (fakt som z toho jeleň)

ďakujem.
Taps
Profil
peteo:
podle mě bude nutné upravit odkazy, které figurují v rámci dané stránky
juriad
Profil
Taps:
Jde o externí odkazy. Tedy někdo jiný udělal chybu a peteo si té chyby všimnul a než, aby čekal na nápravu, tak by rád ten vadný odkaz zprovoznil přepisovacím pravidlem. Přeci jen se počítá každý příchozí odkaz.

peteo:
Správné pravidlo je:
RewriteRule (.*)\?dotaz=(.*) $1?dotaz=$2
A pravděpodobně chceš přesměrovat [R=301,L], aby se do historie v prohlížeči ani nikam jinam neukládala chybná adresa a nevznikala duplicita ve vyhledávačích.

Podrobný log toho, co se děje při aplikování pravidla:
[Sun Dec 14 22:56:15.824925 2014] [rewrite:trace3] [pid 15411] mod_rewrite.c(475): [client 127.0.0.1:44202] 127.0.0.1 - - [kod.localhost/sid#9d26b0][rid#be2cb0/initial] [perdir /srv/http/kod.djpw.cz/] strip per-dir prefix: /srv/http/kod.djpw.cz/spresne.php?dotaz=sdc -> spresne.php?dotaz=sdc
[Sun Dec 14 22:56:15.824974 2014] [rewrite:trace3] [pid 15411] mod_rewrite.c(475): [client 127.0.0.1:44202] 127.0.0.1 - - [kod.localhost/sid#9d26b0][rid#be2cb0/initial] [perdir /srv/http/kod.djpw.cz/] applying pattern '(.*)\\?dotaz=(.*)' to uri 'spresne.php?dotaz=sdc'
[Sun Dec 14 22:56:15.824995 2014] [rewrite:trace2] [pid 15411] mod_rewrite.c(475): [client 127.0.0.1:44202] 127.0.0.1 - - [kod.localhost/sid#9d26b0][rid#be2cb0/initial] [perdir /srv/http/kod.djpw.cz/] rewrite 'spresne.php?dotaz=sdc' -> 'spresne.php?dotaz=sdc'
[Sun Dec 14 22:56:15.825004 2014] [rewrite:trace3] [pid 15411] mod_rewrite.c(475): [client 127.0.0.1:44202] 127.0.0.1 - - [kod.localhost/sid#9d26b0][rid#be2cb0/initial] split uri=spresne.php?dotaz=sdc -> uri=spresne.php, args=dotaz=sdc
[Sun Dec 14 22:56:15.825010 2014] [rewrite:trace3] [pid 15411] mod_rewrite.c(475): [client 127.0.0.1:44202] 127.0.0.1 - - [kod.localhost/sid#9d26b0][rid#be2cb0/initial] [perdir /srv/http/kod.djpw.cz/] add per-dir prefix: spresne.php -> /srv/http/kod.djpw.cz/spresne.php
[Sun Dec 14 22:56:15.825018 2014] [rewrite:trace2] [pid 15411] mod_rewrite.c(475): [client 127.0.0.1:44202] 127.0.0.1 - - [kod.localhost/sid#9d26b0][rid#be2cb0/initial] [perdir /srv/http/kod.djpw.cz/] strip document_root prefix: /srv/http/kod.djpw.cz/spresne.php -> /spresne.php
[Sun Dec 14 22:56:15.825028 2014] [rewrite:trace1] [pid 15411] mod_rewrite.c(475): [client 127.0.0.1:44202] 127.0.0.1 - - [kod.localhost/sid#9d26b0][rid#be2cb0/initial] [perdir /srv/http/kod.djpw.cz/] internal redirect with /spresne.php [INTERNAL REDIRECT]
[Sun Dec 14 22:56:15.825096 2014] [rewrite:trace3] [pid 15411] mod_rewrite.c(475): [client 127.0.0.1:44202] 127.0.0.1 - - [kod.localhost/sid#9d26b0][rid#be8e68/initial/redir#1] [perdir /srv/http/kod.djpw.cz/] strip per-dir prefix: /srv/http/kod.djpw.cz/spresne.php -> spresne.php
[Sun Dec 14 22:56:15.825107 2014] [rewrite:trace3] [pid 15411] mod_rewrite.c(475): [client 127.0.0.1:44202] 127.0.0.1 - - [kod.localhost/sid#9d26b0][rid#be8e68/initial/redir#1] [perdir /srv/http/kod.djpw.cz/] applying pattern '(.*)\\?dotaz=(.*)' to uri 'spresne.php'
[Sun Dec 14 22:56:15.825113 2014] [rewrite:trace1] [pid 15411] mod_rewrite.c(475): [client 127.0.0.1:44202] 127.0.0.1 - - [kod.localhost/sid#9d26b0][rid#be8e68/initial/redir#1] [perdir /srv/http/kod.djpw.cz/] pass through /srv/http/kod.djpw.cz/spresne.php
peteo
Profil
ďakujem, funguje, čomu som nesmierne rád.

len ma prekvapilo, že vlastne prepis

RewriteRule (.*)\?dotaz=(.*) $1?dotaz=$2

je prepis seba samým (?dotaz= -> ?dotaz=), ak som to správne pochopil.

prečo teda nemôže byť

RewriteRule (.*)\%3Fdotaz%3D(.*) $1?dotaz=$2
%3Fdotaz%3D -> ?dotaz=

?

---
ako vidieť, stále to ostáva pre mňa španielskou dedinou, preto je moja vďaka o to väščšia.

;)
juriad
Profil
peteo:
Všimni si konce prvního řádku logu. Apache identifikuje soubor spresne.php?dotaz=sdc. Tedy dekódoval znaky zapsané procenty.
Ano, přepisuje to na ten samý, toho jsem si nevšiml (byl jsem zaujatý tím, že to funguje). Ale on funguje jakýkoli přepis, který se provede. To zajistí, že se znovu vytvoří URI a následně se znovu rozparsuje, tentokrát však nebude obsahovat procenta.

Stejně funguje i pravidlo:
RewriteRule (.*) $1

Ale to mé první má výhody:
1) je popisnější, je zřejmé proč tam je
2) přepisuje jen adresy, které jsou chybné
3) pokud má flag [R] (přesměrovává), tak se přesměrují jen chybné adresy a tím se stanou správnými. Pokud bys přesměrovával u toho triviálního pravidla (nahraď vše vším), tak bys vytvořil nekonečnou smyčku.

Tedy použij to pravidlo ze [#3] spolu s přesměrováním (důvody přesměrování doufám chápeš).
peteo
Profil
keď som pochopil správne, v podstate sa len jedná o úpravu kódu (z nejakého windovsXXX na utf) - prepisuje znak s prefixom %XX na char?
juriad
Profil
peteo:
Ne, jedná se o to, že někdo omylem prohnal skoro celý odkaz funkcí rawurlencode. Jde o kódování, které se používá pro parametry v URL, nikoli pro celé URL (tedy pokud nechceš předávat URL jako parametr v jiné URL). A tedy některé znaky jsou zakódované, přestože by být neměly a jiné jsou dokonce dvakrát.
%3F je ?
%3D je =
%25 je %

Samotné znaky (kromě několika vyjemnovaných) musí být takto zakódovány. A ty znaky jsou v UTF-8.
á ve jméně Belohorcová je zakódované jako %C3%A1, což odpovídá dvojici oktetů C3A1, což je v UTF-8 znak http://www.fileformat.info/info/unicode/char/00e1/index.htm (má kód 00e1, ale v UTF-8 je zapsán jako c3a1).

Popis zakódování:
http://www.faqs.org/rfcs/rfc3986.html
peteo
Profil
někdo omylem prohnal skoro celý odkaz funkcí rawurlencode

jasné, vďaka, konečne to dostáva zmysel.

ešte raz ďakujem za pomoc.

Vaše odpověď


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: