ugrás a tartalomhoz

URL átírása/átirányítása #-es címre Apache 1.3 alatt

kalamona · 2009. Jún. 19. (P), 13.28
Üdv!

Szeretném ha minden url hívását egy .htaccess átalakítaná olyan módon, hogy a path rész elé biggyeszt egy # jelet (ajaxos hívásokhoz)

tehát:

www.xxxx.hu/user/feri -ből www.xxxx.hu/#user/feri lenne.


Az alábbi kód működik is localhoston XAMPP-al (2.2-es apache), ám szerveren (ahol 1.3-as apache van) végtelen átirányítási hurokba keveredik.

RewriteEngine On
RewriteRule ^(.*[^#]+.*)$ /#$1 [redirect=permanent,last,noescape]


Úgy vettem észre, hogy ez azért történik meg, mert
- www.xxxx.hu/user/feri megérkezik,
- .htaccess átirányítja www.xxxx.hu/#user/feri -ra (ha már van benne # a regexpem szerint érintetlenül hagyja az url-t),
- átirányítás után mivel nincs megadva filenév www.xxxx.hu/index.php-re próbál ugrani, azaz valamiért elveszti a #-es részt. Ugyanezt a 2.2-es xampp-os apachnál megőrzi.
- ezután az url már www.xxxx.hu/index.php megint átirányítja a htaccess, lesz belőle www.xxxx.hu/#index.php
-aminél megint nincs filenév, tehát www.xxxx.hu/index.php-lesz belőle
- és így tovább....

Hogyan lehetne 1.3-as apache alatt ezt a problémát megoldani, már ha a verziószámmal összefügg egyáltalán. Vagy van valamilyen beállítás arra, hogy a #-vel kezdődő rész ne vesszen el ilyenkor?

Van ötletetek?

Köszi szépen!
 
1

Miért hagyná érintetlenül

Poetro · 2009. Jún. 19. (P), 14.04
^(.*[^#]+.*)$
Hiszen ebben lehet # mind az első mind a második .* esetén.
2

1.3?

janoszen · 2009. Jún. 19. (P), 14.09
Az 1.3-as Apache tudtommal nem volt ANNYIRA király Windows alatt (nem mintha a 2-es az lenne) szóval próbáld ki a célgépen is. Egyébként miért kell 1.3-as Apache Neked? Ahogy elnézem, már elég sok mindenki váltott...

Egyébként nézd meg ezt: http://httpd.apache.org/docs/1.3/misc/rewriteguide.html (Extended Redirection rész).
4

nem win

kalamona · 2009. Jún. 19. (P), 14.29
Linuxon van az 1.3, magán a célgépen. És nincs lehetőség upgradelni, bizonyos dolgok miatt (már puhatolóztam) még egy darabig ez marad. Szóval az élesen van 1.3, localban van win-en nekem egy xampp-om 2.2-es apache-al.

De nem is biztos hogy apache verziófüggő a dolog, ezzel csak én gyanúsítottam meg.

Megnézem a linket, köszi.
3

Átirányítás?

Joó Ádám · 2009. Jún. 19. (P), 14.15
A # részt a böngésző nem küldi el a kiszolgálónak, felesleges is ellenőrizni, és nem is az Apache „veszti el”.
Elvileg az index.php-ra nem volna szabad átugrania a / címről, nézd meg a válasz fejléceket, szerintem itt van egy átirányítás, ezt kell neked kikapcsolni.
5

2.2

janoszen · 2009. Jún. 19. (P), 15.43
Akkor viszont miért marad meg kalamona-nak 2.2-esnél? Valami itt nem tiszta.
6

Így van, apache 2.2.9 alatt

kalamona · 2009. Jún. 19. (P), 16.15
Így van, apache 2.2.9 alatt teszi a dolgát.

egy tetszőleges ilyenből:
http://www.test.dev/url-rewrite/asdfkadf

ilyet csinál:
http://www.test.dev/url-rewrite/#asdfkadf

(Csak annyiban valtoztattam, hogy a tesztes vhostomon konyvtarból megy)

RewriteEngine On
RewriteRule ^(.*[^#]+.*)$ /url-rewrite/#$1 [redirect=permanent,last,noescape]


Csináltam egy szép index.php-t is, az ennél le is fut, kiechoz dolgokat, de nem válik részévé az új url-nek az index.php string.

Lényeg, hogy itt megy.
7

Élesen

kalamona · 2009. Jún. 19. (P), 16.20
Élesen tökugyanez:

beirom:
http://elesszerver.com/url-rewrite/asdasdf

kihányja:
http://elesszerver.com/url-rewrite/#index.html

Gondolom ott lehet egy DirectoryIndex index.html beállítva, de ez még nem jogosítja fel erre a renitens viselkedésre.
9

Megnézted?

Joó Ádám · 2009. Jún. 19. (P), 16.45
Megnézted már az átirányítást?
11

Meg hát :)

kalamona · 2009. Jún. 19. (P), 17.13
Method Result Type                                      URL
GET    301    Redirect to: http://srv.com/rw/#teve      http://srv.com/rw/teve
GET    301    Redirect to: http://srv.com/rw/#index.php http://srv.com/rw/#teve
GET    301    Redirect to: http://srv.com/rw/#index.php http://srv.com/rw/#index.php
GET    301    Redirect to: http://srv.com/rw/#index.php http://srv.com/rw/#index.php
GET    301    Redirect to: http://srv.com/rw/#index.php http://srv.com/rw/#index.php
GET    301    Redirect to: http://srv.com/rw/#index.php http://srv.com/rw/#index.php
GET    301    Redirect to: http://srv.com/rw/#index.php http://srv.com/rw/#index.php
GET    301    Redirect to: http://srv.com/rw/#index.php http://srv.com/rw/#index.php
GET    301    Redirect to: http://srv.com/rw/#index.php http://srv.com/rw/#index.php
GET    301    Redirect to: http://srv.com/rw/#index.php http://srv.com/rw/#index.php
GET    301    Redirect to: http://srv.com/rw/#index.php http://srv.com/rw/#index.php
GET    301    Redirect to: http://srv.com/rw/#index.php http://srv.com/rw/#index.php
GET    301    Redirect to: http://srv.com/rw/#index.php http://srv.com/rw/#index.php
GET    301    Redirect to: http://srv.com/rw/#index.php http://srv.com/rw/#index.php
GET    301    Redirect to: http://srv.com/rw/#index.php http://srv.com/rw/#index.php
GET    301    Redirect to: http://srv.com/rw/#index.php http://srv.com/rw/#index.php
GET    301    Redirect to: http://srv.com/rw/#index.php http://srv.com/rw/#index.php
GET    301    Redirect to: http://srv.com/rw/#index.php http://srv.com/rw/#index.php
GET    301    Redirect to: http://srv.com/rw/#index.php http://srv.com/rw/#index.php
GET    301    Redirect to: http://srv.com/rw/#index.php http://srv.com/rw/#index.php
GET    301    text/html (NS_ERROR_REDIRECT_LOOP)        http://srv.com/rw/#index.php
12

Megoldás

Joó Ádám · 2009. Jún. 19. (P), 17.41
A megoldás elég egyszerű: írd át úgy a regexet, hogy /rw/index.php (!) esetén ne irányítson át.
13

Köszi! :) Igen, ez tüneti

kalamona · 2009. Jún. 19. (P), 18.02
Köszi! :)

Igen, ez tüneti kezelés, de egy jó meglátás. Jó volna az okot megszünteti, ami miatt máshogy viselkedik, mint a másik szerveren. Még egy-két kísérlet, aztán legfeljebb marad ez a megoldás.


(A log HttpFox-ból lett kivágva pár oszlopot kihagyva, hogy elférjen itt.)
14

Nem tüneti

Joó Ádám · 2009. Jún. 20. (Szo), 03.53
Ez nem tüneti kezelés, rossz a regexed.

A /rw/teve címből csinál /rw/#teve címet, ami a kiszolgáló szemében /rw/, amit a mod_dir átír /rw/index.php-ra, amit a regexed átír /rw/#index.php-ra, ami viszont a kiszolgáló szemében megint csak /rw/, amit átír /rw/index.php-ra stb.

A kettes Apache valószínűleg okosabb és magától lekezeli az ilyet.
15

Nem kell kötekedni :)

kalamona · 2009. Jún. 20. (Szo), 18.56
Pont azt mondtam, hogy 2.2-es alatt működött. (Tehát nézőpont kérdése, hogy a regex rossz-e.) És pont arról szólt a bejegyzés, hogy az 1.3-as fogyatékossága, hogy nem megy alatta ami 2.2 alatt jó, vagy azon is menne, ha valami opciót átállítanék.
16

Tények

Joó Ádám · 2009. Jún. 22. (H), 01.00
According to the API phases at this time it is too late for any URL manipulations. To overcome this chicken and egg problem mod_rewrite uses a trick: When you manipulate a URL/filename in per-directory context mod_rewrite first rewrites the filename back to its corresponding URL (which is usually impossible, but see the RewriteBase directive below for the trick to achieve this) and then initiates a new internal sub-request with the new URL. This restarts processing of the API phases.


Ahogy fenn már írtam, amikor egérkezik a címed, az elérési út elé bekerül egy kettőskereszt, ami a kiszolgáló szempontjából üres elérési utat jelent, tehát a mod_dir a DirectoryIndex irányelvet követve meghívja az index.php-t, amire ismét alkalmazva lesz a minta, megint keletkezik egy üres elérési út, és beléptünk a végtelen ciklusba.

Ismerve a két modul viselkedését, a regexed logikája hibás. Az, hogy a 2.2-es Apache-on működik, az vagy azt jelenti, hogy létezik egy beállítás, ami globálisan kikapcsolja a minták alkérésekre való alkalmazását, vagy helyetted gondolkodik és nem lép be a ciklusba.

A megoldás vagy az, hogy explicit kihagyatod az index.php-t a mintával, vagy használod a nosubreq|NS kapcsolót a végén.
8

Nem a verzió

Joó Ádám · 2009. Jún. 19. (P), 16.44
Azért, mert nem a verzió a lényeg, hanem az éles környezet beállítása. Ami éppenséggel lehet a verzió sajátossága is, de kézi átalakítás is.
10

Jaja Ezért tettem hozzá,

kalamona · 2009. Jún. 19. (P), 16.52
Jaja

Ezért tettem hozzá, hogy nem biztos, hogy az 1.3-as mivoltából fakadt. És azért jöttem ide eszmét cserélni, mert hátha valakinek lesz ötlete, hogy most béállítás, vagy gonosz manó vagy más szösz van a háttérben.