Как создать дружественный URL в php? - PullRequest
63 голосов
/ 01 мая 2009

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

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

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

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

www.domain.com/profile/12345

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

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

Ответы [ 8 ]

44 голосов
/ 01 мая 2009

Согласно этой статье , вам нужно правило 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'
?>
28 голосов
/ 01 мая 2009

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

.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.
}
14 голосов
/ 19 апреля 2014

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

0) Вопрос

Я пытаюсь спросить тебя так:

Я хочу открыть страницу, например, в профиле Facebook www.facebook.com/kaila.piyush

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

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

теперь мы обновляем новый стиль, но не переписываем. Мы используем 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;
}

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);
}
8 голосов
/ 18 апреля 2016

Простой способ сделать это. Попробуйте этот код. Введите код в ваш 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

4 голосов
/ 01 мая 2009

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

0 голосов
/ 01 мая 2009

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

Один из способов, которые мне действительно нравятся, - если вы используете шаблон front controller , вы также можете использовать 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']));

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

0 голосов
/ 01 мая 2009

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

0 голосов
/ 01 мая 2009

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

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

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

Это RESTful-фреймворк на PHP

...