[pmwiki-users] lots of problems when redirecting or rewriting URLs
DaveG
pmwiki at solidgone.com
Wed Jan 18 23:14:18 CST 2006
I'm really getting confused, so I'm going to start from basics, going
line by line through my current script and try to explain what little I
understand to this point. Hopefully that will help educate those of us
up in the back rows :)
From there maybe the light will shine on how to remove that last little
"pmwiki" (in fact I don't really care about that, I just want to
understand this damn thing!).
Any alterations or clarifications are welcome, and then I'll write all
this up on a new wiki page for all to see.
*Addendum:* As I was writing this, a *lot* became clear. The main thing
I realized is that the intent of the .htaccess script is to change URLs
FROM simple format INTO complex format (refer to definitions below).
Pmwiki handles the conversion FROM complex format INTO simple format
that is shown on the browser address bar. I had assumed the exact
reverse, ie the script processes FROM complex to SIMPLE!
--- *Questions*
1] What does $EnablePathInfo = 1; actually do? I think it:
a) rewrites URL's on wiki pages to the simple format;
b) rewrites the browser address bar URL to the simple format;
Thus, the rewrites only need to convert from incoming simple format
to the complex format so that PHP and thus Pmwiki can handle the request.
--- *Definitions*
In the text below, I'll use:
- "complex URL": URL's in the format "/pmwiki.php?n=Main.HomePage".
- "simple URL": URL's in the format "/Main/HomePage".
--- *Background*
PHP needs incoming URL's to be of the complex format in order to process
them correctly. PHP (and thus pmwiki) cannot handle or process simple
URLs, as there is no way to know which parts of the URL are parameters.
Thus, the rules in .htaccess convert from simple format to complex format.
--- *Analysis*
2] Here's the line by line script analysis, assuming the user enters a
simple URL:
http://dom.com/~nepherim/pmwiki/Main/HomePage
and here's the complex URL we need to convert into so PHP can process:
http://dom.com/~nepherim/pmwiki/pmwiki.php?n=Main.HomePage
Pmwiki will handle the the conversion of the "complex URL" back into the
simple format we will see in the browser address bar.
#
Options +FollowSymLinks
Follow existing symbolic links. (Need more detail here.)
#
RewriteEngine on
Turn on the rewrite engine.
#
RewriteBase /~nepherim/pmwiki/
Strip out this part of the url, and leave us with whatever follows.
Thus, from "http://dom.com/~nepherim/pmwiki/Main/HomePage" we now have
"Main/HomePage".
#
RewriteCond %{QUERY_STRING} ^$
Something to enable searching. What I'm not sure of is what condition
needs to be satisfied to execute the following rewrite.
(RewriteCond is basically an IF statement -- if the condition evaluates
to true (AND RewriteCond's immediately following evaluate to true) then
execute the next RewruteRule directive.)
#
RewriteRule ^/?$ ~nepherim/pmwiki/Main/HomePage/ [R=permanent,QSA,L]
Alter URLs with a trailing "/" or with no trailing "/" to the HomePage.
Thus, user entered URLs of "~nepherim/pmwiki" or "~nepherim/pmwiki/"
translate to "~nepherim/pmwiki/Main/HomePage/".
R=permenant: tell the browser that this redirect is permenant. Default
is Temporary.
QSA: Query String Append. If we have queries on the incomming URL, like
"?action=edit" then append them to our new URL.
L: Stop processing. In this case the next RewriteRule doesn't get
processed, and we're done.
*** Question: I must be misunderstanding this parameter. Why do we stop?
If we stop here then we haven't converted to complex format.
#
RewriteRule ^([^/a-z].*) pmwiki.php?n=$1 [QSA,L]
Here we're matching anything which is NOT a lowercase letter (a-z)
followed by anything else. What this means in practice is that we're
finding the pmwiki group and page name, since pmwiki groups always start
with an uppercase character.
(Differentiating between upper and lower case also prevents the
processing of any internal pmwiki paths that are being used to create
the page, like pub, upload, etc.)
The first non-lowercase character we find in "Main/HomePage" is the
first "M", so we take that and everything after: "Main/HomePage".
This string is referenced by "$1". So, the Rewrite Rule replaces our
"Main/HomePage" with "pmwiki.php?n=Main.HomePage".
As we are done with the script, the Base part of the URL
("/~nepherim/pmwiki/") is now added back to what we created, so we end
up with the complex URL PHP and pmwiki needs:
/~nepherim/pmwiki/pmwiki.php?n=Main.HomePage
~ ~ Dave
More information about the pmwiki-users
mailing list