Penguin

Rewrite rules are rules which apply to a string of characters, and replace some of these characters with another string. Chomsky's proposal for linguistics entailed that a grammar be described in terms of a finite number of rewrite rules capable of generating all and only grammatical sentences of a given language.

For example, E -> TF (where E is an expression, T is a term and F is a factor) is a rewrite rule (in the context free grammar for a RegularExpression.)

Most people reading this page will be more interested in Apache's rewrite rules, which let you take a nice URL as seen by visitors and internally rewrite it into the horrible one your backend needs.

mod_rewrite uses a rule-based rewriting engine (based on a regular-expression parser) to rewrite requested URLs on the fly. It supports an unlimited number of rules and an unlimited number of attached rule conditions for each rule to provide a really flexible and powerful URL manipulation mechanism. The URL manipulations can depend on various tests, for instance server variables, environment variables, HTTP headers, time stamps and even external database lookups in various formats can be used to achieve a really granular URL matching.

"The great thing about mod_rewrite is it gives you all the configurability and flexibility of Sendmail. The downside to mod_rewrite is that it gives you all the configurability and flexibility of Sendmail." -- Brian Behlendorf, Apache Group

See http://httpd.apache.org/docs/mod/mod_rewrite.html.

On a related not I was mucking about with phpWiki and trying to get it to work the same way you have it set up. Ie, using path info based urls (eg, /wiki/!SomePageHere?) and I couldn't get it to work. I'd be interested to know how you set yours up.

in the index.php "config" file

define('SCRIPT_NAME', '/wlug'); define('DATA_PATH', '/phpwiki-1.3.3'); define('VIRTUAL_PATH', '/wlug');

% mkdir wlug % cd wlug % cat >.htaccess <<EOF

RewriteRule? (.*) /phpwiki-1.3.3/index.php/$1 [L?

RewriteEngine? On

EOF

For the CRCnet wiki I do it this way

  • In your docroot have two directories, one called wiki and another called phpwiki (or whatever) the wiki directory should have no files in it at the moment, the phpwiki directory should have the wiki source
  • In the wiki directory create a .htaccess file that looks like the following

Action x-phpwiki-page /phpwiki/index.php

SetHandler? x-phpwiki-page

DirectoryIndex? /phpwiki/index.php

  • Make sure that !AllowOverrides? is set appropriately to allow the .htaccess file to be used

I think that is all :)

However...

...with the above method you get issues with trailing slashes, or more specifically, lack of them. If you don't use one, the wiki will helpfully give you the definition of whatever you www root is. So to get around this, the following applies:

  • Copy your index.php file from where ever it is to a file in your www root simply called wiki
  • Edit .htaccess in your www root to have something like this:

<Files wiki>

ForceType? application/x-httpd-php

</Files>

This will force Apache to treat the file as a PHP file even though it has no extension.

  • Edit your new wiki file and make sure DATA_PATH, SCRIPT_NAME and VIRTUAL_PATH are set properly (as shown at the top of this page).
  • Define PHPWIKI_DIR to be the same as DATA_PATH.
  • Add the line

ini_set('include_path', '.:phpwiki-1.3.3');

to 'wiki'. Make sure you set this before anything else, particularly the include for prepend.php.

...and you should be all set.