Как создать дружественный URL-адрес в php?

Обычно практика или очень старый способ отображения какой-либо страницы профиля выглядит следующим образом:

www.domain.com/profile.php?u=12345 

где u=12345 – идентификатор пользователя.

В последние годы я нашел несколько веб-сайтов с очень хорошими URL-адресами:

 www.domain.com/profile/12345 

Как это сделать в PHP?

Как дикое предположение, это как-то связано с файлом .htaccess ? Можете ли вы дать мне больше советов или какой-нибудь пример кода о том, как написать файл .htaccess ?

Согласно этой статье вы хотите, чтобы mod_rewrite (помещенный в файл .htaccess ), который выглядит примерно так:

 RewriteEngine on RewriteRule ^/news/([0-9]+)\.html /news.php?news_id=$1 

И это отображает запросы от

 /news.php?news_id=63 

в

 /news/63.html 

Другая возможность делает это с forcetype , который заставляет что-либо спускаться по определенному пути использования php для оценки содержимого. Итак, в вашем файле .htaccess поставьте следующее:

 <Files news> ForceType application/x-httpd-php </Files> 

И тогда index.php может принять действие на основе переменной $_SERVER['PATH_INFO'] :

 <?php echo $_SERVER['PATH_INFO']; // outputs '/63.html' ?> 

Недавно я применил следующее в приложении, которое хорошо работает для моих нужд.

.htaccess

 <IfModule mod_rewrite.c> # enable rewrite engine RewriteEngine On # if requested url does not exist pass it as path info to index.php RewriteRule ^$ index.php?/ [QSA,L] RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule (.*) index.php?/$1 [QSA,L] </IfModule> 

index.php

 foreach (explode ("/", $_SERVER['REQUEST_URI']) as $part) { // Figure out what you want to do with the URL parts. } 

Я пытаюсь объяснить эту проблему шаг за шагом в следующем примере.

0) Вопрос

Я пытаюсь спросить вас так:

Я хочу открыть страницу, например, facebook profile http://www.facebook.com/kaila.piyush

он получает идентификатор от url и анализирует его на файл profile.php и возвращает данные из базы данных и показывает пользователю его профиль

Обычно, когда мы разрабатываем какой-либо сайт, его ссылка выглядит как http://www.website.com/profile.php?id=username example.com/weblog/index.php?y=2000&m=11&d=23&id=5678

теперь мы обновляем новый стиль, а не переписываем, мы используем http://www.website.com/username или example.com/weblog/2000/11/23/5678 как постоянную ссылку

 http://example.com/profile/userid (get a profile by the ID) http://example.com/profile/username (get a profile by the username) http://example.com/myprofile (get the profile of the currently logged-in user) 

1) .htaccess

Создайте файл .htaccess в корневой папке или обновите существующий файл:

 Options +FollowSymLinks # Turn on the RewriteEngine RewriteEngine On # Rules RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule ^(.*)$ /index.php 

Что это делает?

Если запрос предназначен для реального каталога или файла (который существует на сервере), index.php не обслуживается, иначе каждый URL-адрес перенаправляется на index.php.

2) index.php

Теперь мы хотим знать, какое действие нужно вызвать, поэтому нам нужно прочитать URL-адрес:

В index.php:

 // index.php // This is necessary when index.php is not in the root folder, but in some subfolder... // We compare $requestURL and $scriptName to remove the inappropriate values $requestURI = explode('/', $_SERVER['REQUEST_URI']); $scriptName = explode('/',$_SERVER['SCRIPT_NAME']); for ($i= 0; $i < sizeof($scriptName); $i++) { if ($requestURI[$i] == $scriptName[$i]) { unset($requestURI[$i]); } } $command = array_values($requestURI); With the url http://example.com/profile/19837, $command would contain : $command = array( [0] => 'profile', [1] => 19837, [2] => , ) Now, we have to dispatch the URLs. We add this in the index.php : // index.php require_once("profile.php"); // We need this file switch($command[0]) { case 'profile' : // We run the profile function from the profile.php file. profile($command([1]); break; case 'myprofile' : // We run the myProfile function from the profile.php file. myProfile(); break; default: // Wrong page ! You could also redirect to your custom 404 page. echo "404 Error : wrong page."; break; } с // index.php // This is necessary when index.php is not in the root folder, but in some subfolder... // We compare $requestURL and $scriptName to remove the inappropriate values $requestURI = explode('/', $_SERVER['REQUEST_URI']); $scriptName = explode('/',$_SERVER['SCRIPT_NAME']); for ($i= 0; $i < sizeof($scriptName); $i++) { if ($requestURI[$i] == $scriptName[$i]) { unset($requestURI[$i]); } } $command = array_values($requestURI); With the url http://example.com/profile/19837, $command would contain : $command = array( [0] => 'profile', [1] => 19837, [2] => , ) Now, we have to dispatch the URLs. We add this in the index.php : // index.php require_once("profile.php"); // We need this file switch($command[0]) { case 'profile' : // We run the profile function from the profile.php file. profile($command([1]); break; case 'myprofile' : // We run the myProfile function from the profile.php file. myProfile(); break; default: // Wrong page ! You could also redirect to your custom 404 page. echo "404 Error : wrong page."; break; } 

2) profile.php

Теперь в файле profile.php у нас должно быть что-то вроде этого:

 // profile.php function profile($chars) { // We check if $chars is an Integer (ie. an ID) or a String (ie. a potential username) if (is_int($chars)) { $id = $chars; // Do the SQL to get the $user from his ID // ........ } else { $username = mysqli_real_escape_string($char); // Do the SQL to get the $user from his username // ........... } // Render your view with the $user variable // ......... } function myProfile() { // Get the currently logged-in user ID from the session : $id = .... // Run the above function : profile($id); } 

Простой способ сделать это. Попробуйте этот код. Поместите код в файл htaccess :

 Options +FollowSymLinks RewriteEngine on RewriteRule profile/(.*)/ profile.php?u=$1 RewriteRule profile/(.*) profile.php?u=$1 

Он создаст симпатичный URL этого типа:

http://www.domain.com/profile/12345/

Для получения дополнительной информации htaccess Pretty URL: http://www.webconfs.com/url-rewriting-tool.php

На самом деле это не PHP, это apache, использующий mod_rewrite. Случается, что пользователь запрашивает ссылку, http://www.example.com/profile/12345, а затем apache прерывает ее, используя правило перезаписи, создавая его так: http://www.example.com/profile.php?u=12345, сервер. Вы можете найти здесь: Rewrite Guide

ModRewrite – не единственный ответ. Вы также можете использовать Options + MultiViews в .htaccess, а затем проверить $_SERVER REQUEST_URI чтобы найти все, что находится в URL-адресе.

Есть много разных способов сделать это. Один из способов – использовать ранее описанные методы RewriteRule для маскировки значений строки запроса.

Один из способов, которым мне очень нравится, – использовать шаблон переднего контроллера , вы также можете использовать URL-адреса, например http://yoursite.com/index.php/path/to/your/page/here, и проанализировать значение $ _SERVER [ 'REQUEST_URI'].

Вы можете легко извлечь бит / path / to / your / page / here со следующим битом кода:

 $route = substr($_SERVER['REQUEST_URI'], strlen($_SERVER['SCRIPT_NAME'])); 

Оттуда вы можете разобрать его, как вам угодно, но ради пита убедитесь, что вы его дезинфицируете;)

Похоже, вы говорите о веб-сервисе RESTful.

http://en.wikipedia.org/wiki/Representational_State_Transfer

Файл .htaccess переписывает все URI, чтобы указать на один контроллер, но это более подробно, чем вы хотите получить в этот момент. Вы можете захотеть взглянуть на перерыв

Это RESTful framework в PHP