Переписывание URL с помощью PHP
у меня есть URL, который выглядит так:
url.com/picture.php?id=51
Как бы я пошел о преобразовании этого URL:
picture.php/Some-text-goes-here/51
Я думаю, что WordPress делает то же самое.
Как мне сделать дружественные URL-адреса в PHP?
5 ответов:
вы можете сделать это 2 способами:
The .маршрут htaccess с mod_rewrite, с
Добавить файл с названием
.htaccess
в корневой папке, и добавить что-то вроде этого:RewriteEngine on RewriteRule ^/?Some-text-goes-here/([0-9]+)$ /picture.php?id=
это скажет Apache включить mod_rewrite для этой папки, и если его попросят URL-адрес, соответствующий регулярному выражению, он перепишет его внутри что вы хотите, без пользователя видя его. Легко, но негибко, так что если вам нужно больше мощность:
маршрут PHP
поместите следующее в свой .htaccess вместо этого: (обратите внимание на ведущую косую черту)
FallbackResource /index.php
это скажет ему, чтобы запустить ваш
index.php
для всех файлов он обычно не может найти на вашем сайте. Там вы можете, например:$path = ltrim($_SERVER['REQUEST_URI'], '/'); // Trim leading slash(es) $elements = explode('/', $path); // Split path on slashes if(empty($elements[0])) { // No path elements means home ShowHomepage(); } else switch(array_shift($elements)) // Pop off first item and switch { case 'Some-text-goes-here': ShowPicture($elements); // passes rest of parameters to internal function break; case 'more': ... default: header('HTTP/1.1 404 Not Found'); Show404Error(); }
это то, как большие сайты и CMS-системы делают это, потому что это позволяет гораздо больше гибкости в разборе URL-адресов, конфигурации и зависимых от базы данных URL-адресов и т. д. Для спорадического использования жестко закодированные правила перезаписи в
.htaccess
будет делать хорошо.
если вы только хотите изменить маршрут
picture.php
затем добавление правила перезаписи в.htaccess
будет служить вашим потребностям, но, если вы хотите переписать URL, как в Wordpress, то PHP-это путь. Вот простой пример для начала.структура папок
есть два файла, которые необходимы в корневой папке
.htaccess
иindex.php
и было бы хорошо, чтобы остальные.php
файлы в отдельной папке, напримерinc/
.root/ inc/ .htaccess index.php
.htaccess
RewriteEngine On RewriteRule ^inc/.*$ index.php RewriteCond %{REQUEST_FILENAME} !-f RewriteRule ^(.*)$ index.php [QSA,L]
этот файл имеет четыре директивы:
RewriteEngine
- включить механизм перезаписиRewriteRule
- запретить доступ ко всем файлам вinc/
папка, перенаправьте любой вызов в эту папку наindex.php
RewriteCond
- разрешить прямой доступ ко всем другим файлам (например, изображения, css или скрипты )RewriteRule
- перенаправить все остальноеindex.php
.php
потому что теперь все перенаправляется на индекс.php, там будет определено, если url-адрес правильный, все параметры присутствуют, и если тип параметров правильный.
для проверки url нам нужно иметь набор правил, и лучшим инструментом для этого является регулярное выражение. Используя регулярные выражения, мы убьем двух мух одним ударом. Url, чтобы пройти этот тест должен иметь все необходимые параметры, которые проверяются на допустимые символы. Вот несколько примеров правил.
$rules = array( 'picture' => "/picture/(?'text'[^/]+)/(?'id'\d+)", // '/picture/some-text/51' 'album' => "/album/(?'album'[\w\-]+)", // '/album/album-slug' 'category' => "/category/(?'category'[\w\-]+)", // '/category/category-slug' 'page' => "/page/(?'page'about|contact)", // '/page/about', '/page/contact' 'post' => "/(?'post'[\w\-]+)", // '/post-slug' 'home' => "/" // '/' );
Далее необходимо подготовить uri запроса.
$uri = rtrim( dirname($_SERVER["SCRIPT_NAME"]), '/' ); $uri = '/' . trim( str_replace( $uri, '', $_SERVER['REQUEST_URI'] ), '/' ); $uri = urldecode( $uri );
теперь, когда у нас есть uri запроса, последний шаг-проверить uri на правилах регулярного выражения.
foreach ( $rules as $action => $rule ) { if ( preg_match( '~^'.$rule.'$~i', $uri, $params ) ) { /* now you know the action and parameters so you can * include appropriate template file ( or proceed in some other way ) */ } }
удачный матч, так как мы используем именованные подшаблоны в регулярных выражениях, заполнить
$params
массив почти такой же как PHP заполняет$_GET
массив. Однако при использовании динамического url,$_GET
массив заполняется без каких-либо проверок параметров./picture/some+text/51 Array ( [0] => /picture/some text/51 [text] => some text [1] => some text [id] => 51 [2] => 51 ) picture.php?text=some+text&id=51 Array ( [text] => some text [id] => 51 )этих нескольких строк кода и базового знания регулярных выражений достаточно, чтобы начать строить прочную систему маршрутизации.
источник
define( 'INCLUDE_DIR', dirname( __FILE__ ) . '/inc/' ); $rules = array( 'picture' => "/picture/(?'text'[^/]+)/(?'id'\d+)", // '/picture/some-text/51' 'album' => "/album/(?'album'[\w\-]+)", // '/album/album-slug' 'category' => "/category/(?'category'[\w\-]+)", // '/category/category-slug' 'page' => "/page/(?'page'about|contact)", // '/page/about', '/page/contact' 'post' => "/(?'post'[\w\-]+)", // '/post-slug' 'home' => "/" // '/' ); $uri = rtrim( dirname($_SERVER["SCRIPT_NAME"]), '/' ); $uri = '/' . trim( str_replace( $uri, '', $_SERVER['REQUEST_URI'] ), '/' ); $uri = urldecode( $uri ); foreach ( $rules as $action => $rule ) { if ( preg_match( '~^'.$rule.'$~i', $uri, $params ) ) { /* now you know the action and parameters so you can * include appropriate template file ( or proceed in some other way ) */ include( INCLUDE_DIR . $action . '.php' ); // exit to avoid the 404 message exit(); } } // nothing is found so handle the 404 error include( INCLUDE_DIR . '404.php' );
это .htaccess файл, который вперед почти все индексировать.php
# if a directory or a file exists, use it directly RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-l RewriteCond %{REQUEST_URI} !-l RewriteCond %{REQUEST_FILENAME} !\.(ico|css|png|jpg|gif|js)$ [NC] # otherwise forward it to index.php RewriteRule . index.php
тогда до вас разбирать $_SERVER ["REQUEST_URI"] и маршрут к картинке.php или что-то еще
PHP-это не то, что вы ищете, проверить mod_rewrite
хотя уже ответил, и намерение автора состоит в том, чтобы создать приложение типа front controller, но я публикую буквальное правило для заданной проблемы. если у кого-то есть проблема для того же.
RewriteEngine On RewriteRule ^([^/]+)/([^/]+)/([\d]+)$ ?id= [L]
выше должно работать для url
picture.php/Some-text-goes-here/51
. без использования индекса.php как приложение для перенаправления.