Location: PHPKode > projects > Question2Answer > question2answer/qa-include/qa-index.php
<?php

/*
	Question2Answer (c) Gideon Greenspan

	http://www.question2answer.org/

	
	File: qa-include/qa-index.php
	Version: See define()s at top of qa-include/qa-base.php
	Description: The Grand Central of Q2A - most requests come through here


	This program is free software; you can redistribute it and/or
	modify it under the terms of the GNU General Public License
	as published by the Free Software Foundation; either version 2
	of the License, or (at your option) any later version.
	
	This program is distributed in the hope that it will be useful,
	but WITHOUT ANY WARRANTY; without even the implied warranty of
	MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
	GNU General Public License for more details.

	More about this license: http://www.question2answer.org/license.php
*/

//	Try our best to set base path here just in case it wasn't set in index.php (pre version 1.0.1)

	if (!defined('QA_BASE_DIR'))
		define('QA_BASE_DIR', dirname(empty($_SERVER['SCRIPT_FILENAME']) ? dirname(__FILE__) : $_SERVER['SCRIPT_FILENAME']).'/');


//	If this is an special non-page request, branch off here

	if (@$_POST['qa']=='ajax')
		require 'qa-ajax.php';

	elseif (@$_GET['qa']=='image')
		require 'qa-image.php';

	elseif (@$_GET['qa']=='blob')
		require 'qa-blob.php';

	else {
		
	//	Otherwise, load the Q2A base file which sets up a bunch of crucial stuff
		
		require 'qa-base.php';
		
	
	//	Determine the request and root of the installation, and the requested start position used by many pages
		
		function qa_index_set_request()
		{
			if (qa_to_override(__FUNCTION__)) { $args=func_get_args(); return qa_call_override(__FUNCTION__, $args); }
		
			$relativedepth=0;
			
			if (isset($_GET['qa-rewrite'])) { // URLs rewritten by .htaccess
				$urlformat=QA_URL_FORMAT_NEAT;
				$requestparts=explode('/', qa_gpc_to_string($_GET['qa-rewrite']));
				unset($_GET['qa-rewrite']);
				$relativedepth=count($requestparts);
				
				// Workaround for fact that Apache unescapes characters while rewriting, based on assumption that $_GET['qa-rewrite'] has
				// right path depth, which is true so long as there are only escaped characters in the last part of the path
				if (!empty($_SERVER['REQUEST_URI'])) {
					$origpath=$_SERVER['REQUEST_URI'];
					$_GET=array();
					
					$questionpos=strpos($origpath, '?');
					if (is_numeric($questionpos)) {
						$params=explode('&', substr($origpath, $questionpos+1));
						
						foreach ($params as $param)
							if (preg_match('/^([^\=]*)(\=(.*))?$/', $param, $matches)) {
								$argument=strtr(urldecode($matches[1]), '.', '_'); // simulate PHP's $_GET behavior
								$_GET[$argument]=qa_string_to_gpc(urldecode(@$matches[3]));
							}
		
						$origpath=substr($origpath, 0, $questionpos);
					}
					
					$requestparts=array_slice(explode('/', urldecode($origpath)), -count($requestparts));
				}
				
			} elseif (isset($_GET['qa'])) {
				if (strpos($_GET['qa'], '/')===false) {
					$urlformat=( (empty($_SERVER['REQUEST_URI'])) || (strpos($_SERVER['REQUEST_URI'], '/index.php')!==false) )
						? QA_URL_FORMAT_SAFEST : QA_URL_FORMAT_PARAMS;
					$requestparts=array(qa_gpc_to_string($_GET['qa']));
					
					for ($part=1; $part<10; $part++)
						if (isset($_GET['qa_'.$part])) {
							$requestparts[]=qa_gpc_to_string($_GET['qa_'.$part]);
							unset($_GET['qa_'.$part]);
						}
				
				} else {
					$urlformat=QA_URL_FORMAT_PARAM;
					$requestparts=explode('/', qa_gpc_to_string($_GET['qa']));
				}
				
				unset($_GET['qa']);
			
			} else {
				$phpselfunescaped=strtr($_SERVER['PHP_SELF'], '+', ' '); // seems necessary, and plus does not work with this scheme
				$indexpath='/index.php/';
				$indexpos=strpos($phpselfunescaped, $indexpath);
				
				if (is_numeric($indexpos)) {
					$urlformat=QA_URL_FORMAT_INDEX;
					$requestparts=explode('/', substr($phpselfunescaped, $indexpos+strlen($indexpath)));
					$relativedepth=1+count($requestparts);
			
				} else {
					$urlformat=null; // at home page so can't identify path type
					$requestparts=array();
				}
			}
			
			foreach ($requestparts as $part => $requestpart) // remove any blank parts
				if (!strlen($requestpart))
					unset($requestparts[$part]);
					
			reset($requestparts);
			$key=key($requestparts);
			
			$replacement=array_search(@$requestparts[$key], qa_get_request_map());
			if ($replacement!==false)
				$requestparts[$key]=$replacement;
		
			qa_set_request(
				implode('/', $requestparts),
				($relativedepth>1) ? str_repeat('../', $relativedepth-1) : './',
				$urlformat
			);
		}
	
		qa_index_set_request();
		
		
	//	Branch off to appropriate file for further handling
	
		$requestlower=strtolower(qa_request());
		
		if ($requestlower=='install')
			require QA_INCLUDE_DIR.'qa-install.php';
			
		elseif ($requestlower==('url/test/'.QA_URL_TEST_STRING))
			require QA_INCLUDE_DIR.'qa-url-test.php';
		
		else {
	
		//	Enable gzip compression for output (needs to come early)
	
			if (QA_HTML_COMPRESSION) // on by default
				if (substr($requestlower, 0, 6)!='admin/') // not for admin pages since some of these contain lengthy processes
					if (extension_loaded('zlib') && !headers_sent())
						ob_start('ob_gzhandler');
						
			if (substr($requestlower, 0, 5)=='feed/')
				require QA_INCLUDE_DIR.'qa-feed.php';
			else
				require QA_INCLUDE_DIR.'qa-page.php';
		}
	}
	
	qa_report_process_stage('shutdown');


/*
	Omit PHP closing tag to help avoid accidental output
*/
Return current item: Question2Answer