Я начал использовать встроенный в PHP 5.6 веб-сервер с помощью следующей команды:
php -S localhost:80
Я использовал WAMP Server раньше. И в руководстве также сказано, что, если вы дадите скрипт маршрутизатора для вышеприведенной команды, скажите как:
php -S localhost:80 router.php
Мы можем достичь чего-то вроде .htaccess
, Но я не смог найти надежный учебник о том, как сделать перенаправление или включить. Прямо сейчас мой .htaccess
Файл имеет это содержимое:
RewriteEngine On
RewriteRule (.*)-(.*)\.htm$ ./?page=$1&sub=$2&%{QUERY_STRING}
RewriteRule ^([^/]*)\.htm$ ./?page=$1&%{QUERY_STRING} [L]
Что я должен положить в router.php
чтобы добиться того же результата, который был у меня на веб-сервере Apache? Заранее спасибо.
<?php
$_matches = array();
/**
* Initialize the rewrite environment.
*/
function initialize() {
set_environment($_SERVER['REQUEST_URI']);
}
/**
* Set important environment variables and re-parse the query string.
* @return boolean
*/
function finalize() {
if (defined('REWRITER_FINALIZED')) return false;
define('REWRITER_FINALIZED', true);
if (\is_file($_SERVER['DOCUMENT_ROOT'] . $_SERVER['SCRIPT_NAME'])) {
$_SERVER['SCRIPT_FILENAME'] = $_SERVER['DOCUMENT_ROOT'] . $_SERVER['SCRIPT_NAME'];
}
if (isset($_SERVER['QUERY_STRING'])) {
$_GET = [];
parse_str($_SERVER['QUERY_STRING'], $_GET);
}
$_SERVER['PHP_SELF'] = $_SERVER['SCRIPT_NAME'];
return true;
}
/**
* Adjust the server environment variables to match a given URL.
* @param string $url
*/
function set_environment($url) {
$url = rtrim($url, '&?');
$request_uri = $script_name = $url;
$query_string = null;
if (strpos($url, '?') > 0) {
$script_name = substr($url, 0, strpos($url, '?'));
$query_string = substr($url, 1 + strpos($url, '?'));
}
$_SERVER['REQUEST_URI'] = $request_uri;
$_SERVER['SCRIPT_NAME'] = $script_name;
$_SERVER['QUERY_STRING'] = $query_string;
}
/**
* Parse regular expression matches. eg. $0 or $1
* @param string $url
* @return string
*/
function parse_matches($url) {
$replace = function($bit) {
global $matches;
return isset($matches[$bit[1]])
? $matches[$bit[1]]
: null;
};
return preg_replace_callback('/\$([0-9]+)/', $replace, $url);
}
/**
* Parse Apache style rewrite parameters. eg. %{QUERY_STRING}
* @param string $url
* @return string
*/
function parse_parameters($url) {
$replace = function($bit) {
return isset($_SERVER[$bit[1]])
? $_SERVER[$bit[1]]
: null;
};
return preg_replace_callback('/%\{([A-Z_+]+)\}/', $replace, $url);
}
/**
* Change the internal url to a different url.
* @param string $from Regular expression to match current url, or optional when used in conjunction with `test`.
* @param string $to URL to redirect to.
* @return boolean
*/
function rewrite($from, $to = null) {
if (defined('REWRITER_FINALIZED')) return false;
$url = $_SERVER['SCRIPT_NAME'];
if (isset($to)) {
$url = preg_replace($from, $to, $url);
} else {
$url = parse_matches($from);
}
set_environment(
parse_parameters($url)
);
return true;
}
/**
* Compare a regular expression against the current request, store the matches for later use.
* @return boolean
*/
function test($expression) {
global $matches;
if (defined('REWRITER_FINALIZED')) return false;
return 0 < (integer)preg_match($expression, $_SERVER['SCRIPT_NAME'], $matches);
}
initialize();
// Your rewrite rules here.
test('%/(.*)-(.*)\.htm$%') && rewrite('/?page=$1&sub=$2&%{QUERY_STRING}') && finalize();
test('%^([^/]*)\.htm$%') && rewrite('/?page=$0&%{QUERY_STRING}') && finalize();
echo "<pre>";
var_dump($_SERVER);
// include index.php or something
Я включил несколько «вспомогательных» функций, которые облегчат написание ваших правил перезаписи (заимствованный здесь).
Старый вопрос, но вот простая версия:
<?php
/* Friendly Urls
================================================
RewriteEngine On
RewriteCond %{SCRIPT_FILENAME} !-f [NC]
RewriteCond %{SCRIPT_FILENAME} !-d [NC]
RewriteRule ^(.+)$ /index.php?page=$1 [QSA,L]
================================================ */
$root=__dir__;
$uri=parse_url($_SERVER['REQUEST_URI'])['path'];
$page=trim($uri,'/');
if (file_exists("$root/$page") && is_file("$root/$page")) {
return false; // serve the requested resource as-is.
exit;
}
$_GET['page']=$page;
require_once 'index.php';
?>
Таким образом, вы можете использовать обычный index.php
что вы могли бы использовать, скажем, с сервером Apache.
Я нашел учебник в блоге Туннель Реальности который ссылался на блог на Ripeworks это содержало скрипт роутера, который работал для меня.
Сценарий маршрутизатора, который они дали
<?php
$root = $_SERVER['DOCUMENT_ROOT'];
chdir($root);
$path = '/'.ltrim(parse_url($_SERVER['REQUEST_URI'])['path'],'/');
set_include_path(get_include_path().':'.__DIR__);
if(file_exists($root.$path))
{
if(is_dir($root.$path) && substr($path,strlen($path) - 1, 1) !== '/')
$path = rtrim($path,'/').'/index.php';
if(strpos($path,'.php') === false) return false;
else {
chdir(dirname($root.$path));
require_once $root.$path;
}
}else include_once 'index.php';