PHP передать url в index.php

Это должно быть очень просто, но я хочу иметь возможность использовать url как переменную, как это делают PHP-фреймы.

mywebsite.com/hello-world 

Я хочу, чтобы index.php отображал «hello-world» как переменную, и я хочу, чтобы index.php загружался. Это делается через php или мне нужно использовать файл htaccess?

Многие php-фреймворки используют URL-адреса для отправки сообщения в индексный файл … например …

 mysite.com/controller/view 

Как я буду маршрутизировать их самостоятельно через php?

Небольшая помощь?

Есть 2 шага:

  1. Перепишите URL-адрес, используя файл .htaccess (на linux). Вы должны убедиться, что все запросы отправлены в ваш php-файл, поэтому вам нужно будет переписать все запросы на несуществующие файлы и папки в ваш php-файл;
  2. В вашем php-файле вы анализируете URL-адрес (используя, например, $_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 в конце при определении имени представления.

Я лично хотел что-то подобное недавно без полноценных фреймворков, поэтому я использовал эту микроструктуру для выполнения маршрутизации, и это сработало очень хорошо:

http://www.slimframework.com/

Затем вы можете написать свой собственный класс контроллера и настроить маршрутизацию; вот код, который я использовал:

 $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); }