Hello,

I am in the process of implementing persistent sessions using
Apache::Session with the session_id stored in the URL and it mostly
works. In the HTML::Mason autohandler there is the following filter:

<%filter>
$r->pnotes("cookie") # mangle URL only if cookie is missing
        || s#\bhref\s*=\s*"(/(?!S=)[^"\s]*)"#href="/S=$session{_session_id}$1"#gi;
</%filter>

... which adds the session_id to all href links, only if the browser
doesn't return any cookie.

Now in httpd.conf there is a mod_rewrite rule inspired by a recent
thread on the modperl list:

RewriteRule ^/S=([^/]+)(/.*) $2 [E=AF_SID:$1]

This removes the session_id from the URL and adds it to the AF_SID
environment variable. This works well for all absolute URLs (starting
with a /) which is puzzling because I remember reading in this thread
that this technique mandated _relative_ URLs.

The rewrite rule fails only in one case, the root URL:

http://my.site.com/S=1d2e580af1e31cf2/Sell/index.html

... is correctly converted to 

http://my.site.com/Sell/index.html

... *but*

http://my.site.com/S=1d2e580af1e31cf2/

... fails with a 404 NOT FOUND error

>From the rewrite log:

127.0.0.1 - - [23/Jul/2000:15:57:31 +0200] [apartia.int/sid#815769c][rid#8149464
/initial] (2) init rewrite engine with requested uri /S=3b2c1685dcc26394/
127.0.0.1 - - [23/Jul/2000:15:57:31 +0200] [apartia.int/sid#815769c][rid#8149464
/initial] (3) applying pattern '^/S=([^/]+)(/.*)' to uri '/S=3b2c1685dcc26394/'
127.0.0.1 - - [23/Jul/2000:15:57:31 +0200] [apartia.int/sid#815769c][rid#8149464
/initial] (2) rewrite /S=3b2c1685dcc26394/ -> /
127.0.0.1 - - [23/Jul/2000:15:57:31 +0200] [apartia.int/sid#815769c][rid#8149464
/initial] (2) local path result: /
127.0.0.1 - - [23/Jul/2000:15:57:31 +0200] [apartia.int/sid#815769c][rid#8149464
/initial] (1) go-ahead with / [OK]
[Sun Jul 23 15:57:31 2000] [error] [client 127.0.0.1] File does not exist: /

... so after tinkering with various mod_rewrite options for a while I
changed the RewriteRule to:

RewriteRule ^/S=([^/]+)(/.*) %{DOCUMENT_ROOT}$2 [E=AF_SID:$1]

... and now everything works fine. 

But I'm still not happy because I don't understand _why_ it works.

Please let me know if you have a rational explanation.

TIA

-- 
Louis-David Mitterrand - [EMAIL PROTECTED] - http://www.apartia.fr

# rm *;o
o : command not found

Reply via email to