00965: Clean URLs & Apache MultiViews/Alias issue

Summary: Clean URLs & Apache MultiViews/Alias issue
Created: 2007-08-09 08:25
Status: Open
Category: Bug
From: julien /dot/ charbon /at/ gmail /dot/ com, Dfaure
Assigned:
Priority: 52
Version: 2.2.0-beta63
OS: Apache 2.2.3 & Php 5.2.0

Description: Hi, I configure pmwiki to get clean URLs using Apache MultiViews as defined in:

Wrapper using Apache MultiViews

And I guess I find a bug. You have in pmwiki.php:296:

 $pagename = @$_REQUEST['n'];
 if (!$pagename) $pagename = @$_REQUEST['pagename'];
 if (!$pagename &&
     preg_match('!^'.preg_quote($_SERVER['SCRIPT_NAME'],'!').'/?([^?]*)!',
       $_SERVER['REQUEST_URI'],$match))
   $pagename = urldecode($match[1]);

Or with clean URLs using Apache MultiViews configuration on a request on :

 http://host/wiki/Group/Page

you have

 $_SERVER['SCRIPT_NAME'] is equal to "wiki.php"
 $_SERVER['REQUEST_URI'] is equal to /wiki/Group/Page

thus:

 preg_match('!^'.preg_quote($_SERVER['SCRIPT_NAME'],'!').'/?([^?]*)!',
       $_SERVER['REQUEST_URI'],$match))

failed and I get an empty pagename value.

Below a patch a correct this issue for me. This not the final correction but this patch show precisely where is the issue.

Attach:pmwiki-patch-00965.txt


I had the same kind of issue (ie. inconsistency between $_SERVER['SCRIPT_NAME'] and $_SERVER['REQUEST_URI']) in the following config:

  • Win32,
  • Apache 2.2.4,
  • Php 4.4.7 as CGI (with cgi.fix_pathinfo=1),
  • Apache location defined with an url alias different from the directory name used:
  Alias /~dev "C:/hosted/pmwiki-dev"
  <Directory "C:/hosted/pmwiki-dev">
    AddType application/x-httpd-php4 .php
    ...
  </Directory>

In this case:

  ['SCRIPT_NAME'] => /pmwiki-dev/pmwiki.php
  ['REQUEST_URI'] => /~dev/pmwiki.php/Group/Page

And I manage to solve it with the following code in config.php:

  if (!$pagename
      && (strpos($_SERVER['REQUEST_URI'], $_SERVER['SCRIPT_NAME']) === false)
      && preg_match('!^'.preg_quote(str_replace($_SERVER['PATH_INFO'], '',
                                                $_SERVER['REQUEST_URI']),'!')
                        .'/?([^?]*)!',
                    $_SERVER['REQUEST_URI'],$match))
    $pagename = urldecode($match[1]);

Dfaure October 04, 2007, at 09:50 AM