Skip to content


Subversion checkout URL

You can clone with HTTPS or Subversion.

Download ZIP
Fetching contributors…

Cannot retrieve contributors at this time

94 lines (75 sloc) 3.528 kb
* Rewrites SEF URLs to their actual files.
* @copyright (C) 2008-2012 PunBB, partially based on code (C) 2008-2009
* @license GPL version 2 or higher
* @package PunBB
define('FORUM_ROOT', './');
require FORUM_ROOT.'include/essentials.php';
// Bring in all the rewrite rules
if (file_exists(FORUM_ROOT.'include/url/'.$forum_config['o_sef'].'/rewrite_rules.php'))
require FORUM_ROOT.'include/url/'.$forum_config['o_sef'].'/rewrite_rules.php';
require FORUM_ROOT.'include/url/Default/rewrite_rules.php';
// Allow extensions to create their own rewrite rules/modify existing rules
($hook = get_hook('re_rewrite_rules')) ? eval($hook) : null;
// If query string is not set properly, create one and set $_GET
// E.g. lighttpd's 404 handler does not pass query string
if ((!isset($_SERVER['QUERY_STRING']) || empty($_SERVER['QUERY_STRING'])) && strpos($_SERVER['REQUEST_URI'], '?') !== false)
$_SERVER['QUERY_STRING'] = isset($_SERVER['QUERY_STRING']['query']) ? $_SERVER['QUERY_STRING']['query'] : '';
parse_str($_SERVER['QUERY_STRING'], $_GET);
// We determine the path to the script, since we need to separate the path from the data to be rewritten
$path_to_script = str_replace('\\', '/', dirname($_SERVER['SCRIPT_NAME']));
if (substr($path_to_script, -1) != '/')
$path_to_script = $path_to_script.'/';
// We create our own request URI with the path removed and only the parts to rewrite included
$request_uri = substr(urldecode($_SERVER['REQUEST_URI']), strlen($path_to_script));
if (strpos($request_uri, '?') !== false)
$request_uri = substr($request_uri, 0, strpos($request_uri, '?'));
$rewritten_url = '';
$url_parts = array();
// We go through every rewrite rule
foreach ($forum_rewrite_rules as $rule => $rewrite_to)
// We have a match!
if (preg_match($rule, $request_uri))
$rewritten_url = preg_replace($rule, $rewrite_to, $request_uri);
$url_parts = explode('?', $rewritten_url);
// If there is a query string
if (isset($url_parts[1]))
$query_string = explode('&', $url_parts[1]);
// Set $_GET properly for all of the variables
// We also set $_REQUEST if it's not already set
foreach ($query_string as $cur_param)
$param_data = explode('=', $cur_param);
// Sometimes, parameters don't set a value (eg: script.php?foo), so we set them to null
$param_data[1] = isset($param_data[1]) ? $param_data[1] : null;
// We don't want to be overwriting values in $_REQUEST that were set in POST or COOKIE
if (!isset($_POST[$param_data[0]]) && !isset($_COOKIE[$param_data[0]]))
$_REQUEST[$param_data[0]] = urldecode($param_data[1]);
$_GET[$param_data[0]] = urldecode($param_data[1]);
// If we don't know what to rewrite to, we show a bad request messsage
if (empty($rewritten_url))
header('HTTP/1.1 404 Not Found');
// Allow an extension to override the "Bad request" message with a custom 404 page
($hook = get_hook('re_page_not_found')) ? eval($hook) : null;
error('Page Not found (Error 404):<br />The requested page <em>'.forum_htmlencode($request_uri).'</em> could not be found.');
// We change $_SERVER['PHP_SELF'] so that it reflects the file we're actually loading
$_SERVER['PHP_SELF'] = str_replace('rewrite.php', $url_parts[0], $_SERVER['PHP_SELF']);
require FORUM_ROOT.$url_parts[0];
Jump to Line
Something went wrong with that request. Please try again.