Это должно быть очень просто, но я хочу иметь возможность использовать url как переменную, как это делают PHP-фреймы.
mywebsite.com/hello-world
Я хочу, чтобы index.php отображал «hello-world» как переменную, и я хочу, чтобы index.php загружался. Это делается через php или мне нужно использовать файл htaccess?
Многие php-фреймворки используют URL-адреса для отправки сообщения в индексный файл … например …
mysite.com/controller/view
Как я буду маршрутизировать их самостоятельно через php?
Небольшая помощь?
Есть 2 шага:
.htaccess
(на linux). Вы должны убедиться, что все запросы отправлены в ваш php-файл, поэтому вам нужно будет переписать все запросы на несуществующие файлы и папки в ваш php-файл; $_SERVER['REQUEST_URI']
) и предпринимайте действия в зависимости от его содержимого. Для шага 1. вы можете использовать что-то вроде:
RewriteEngine On RewriteBase / RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule ^(.*)$ your_file.php?url=$1 [L,QSA]
А затем в вашем php-файле на шаге 2. у вас есть запрошенный url в $_GET['url']
.
Редактировать:
Если вы хотите переписать только определенные подкаталоги, вы также можете использовать правило, например:
RewriteRule ^sub/dir/to/rewrite/(.*)$ your_file.php?url=$1 [L,QSA]
Некоторые детали:
^(.*)$
захватывает все (все символы) между началом ^
и концом $
. Они фиксируются с помощью круглых скобок, поэтому вы можете использовать их в строке запроса, например, $1
. В отредактированном примере только раздел после ..../rewrite/
получает захват; [ ... ]
означают, что это последнее правило для обработки и QSA
что исходная строка запроса также добавляется к новому URL-адресу. Это означает, что если ваш URL-адрес /hello-world?some_var=4
, то переменная some_var
добавляется к переписанному URL-адресу: your_file.php?url=hello-world&some_var=4
. Такое перенаправление должно выполняться на уровне веб-сервера либо в конфигурационных файлах Apache для вашего сервера, либо, скорее всего, через файл .htaccess
.
Это файл .htaccess
который я использую на своем собственном сайте, чтобы выполнить такую повторную маршрутизацию:
# Allow any files or directories that exist to be displayed directly RewriteCond %{REQUEST_FILENAME} !-f #Route everything else through index.php RewriteRule .* index.php/?$0 [PT,L]
Затем в index.php
я просматриваю URL-адреса в моей базе данных, чтобы вытащить содержимое страницы:
if(isset($_SERVER['REQUEST_URI']) and strlen($_SERVER['REQUEST_URI']) > 1) $requested_url = substr($_SERVER['REQUEST_URI'], 1); else $requested_url = 'home';
То, что вы хотите достичь, называется шаблоном «Front Controller». Обычно это делается с использованием mod_rewrite
от Apache. Без перезаписи URL-адресов вы все равно можете сделать что-то подобное, но ваши URL-адреса выглядят следующим образом:
mysite.com/index.php/controller/view
Вместо: mysite.com/controller/view
как вы хотите.
Вот минимальный файл .htaccess для перезаписи URL:
RewriteEngine On RewriteCond %{REQUEST_FILENAME} !-f RewriteRule ^ index.php [QSA,L]
Затем вы анализируете URL-адрес из $_SERVER['REQUEST_URI']
но не забудьте удалить все параметры GET в конце при определении имени представления.
Я лично хотел что-то подобное недавно без полноценных фреймворков, поэтому я использовал эту микроструктуру для выполнения маршрутизации, и это сработало очень хорошо:
Затем вы можете написать свой собственный класс контроллера и настроить маршрутизацию; вот код, который я использовал:
$app = new \Slim\Slim(); $app->map('/:controller(/:action)', 'dispatchControllerAction') ->via('GET', 'POST'); function dispatchControllerAction($controllerName, $action='index') { //multi-word controllers and actions should be hyphen-separated in the URL $controllerClass = 'Controllers\\'.ucfirst(camelize($controllerName, '-')); $controller = new $controllerClass; $controller->execute(camelize($action, '-')); } /** * Adapted from the Kohana_Inflector::camelize function (from the Kohana framework) * Added the $altSeparator parameter * * Makes a phrase camel case. Spaces and underscores will be removed. * * $str = Inflector::camelize('mother cat'); // "motherCat" * $str = Inflector::camelize('kittens in bed'); // "kittensInBed" * * @param string $str phrase to camelize * @param string $altSeparator Alternate separator to be parsed in addition to spaces. Defaults to an underscore. * If your string is hyphen-separated (rather than space- or underscore-separated), set this to a hyphen * @return string */ function camelize($str, $altSeparator='_') { $str = 'x'.strtolower(trim($str)); $str = ucwords(preg_replace('/[\s'.$altSeparator.']+/', ' ', $str)); return substr(str_replace(' ', '', $str), 1); }