apache — встроенный веб-сервер PHP 5.4+, например .htaccess

Я начал использовать встроенный в 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? Заранее спасибо.

2

Решение

<?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

Я включил несколько «вспомогательных» функций, которые облегчат написание ваших правил перезаписи (заимствованный здесь).

2

Другие решения

Старый вопрос, но вот простая версия:

<?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.

2

Я нашел учебник в блоге Туннель Реальности который ссылался на блог на 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';
1
По вопросам рекламы [email protected]