Как создать дружественный URL-адрес в php? - программирование
Подтвердить что ты не робот

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

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

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

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

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

www.domain.com/profile/12345

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

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

4b9b3361

Ответ 1

Согласно в этой статье, вы хотите, чтобы 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'
?>

Ответ 2

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

.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.
}

Ответ 3

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

0) Вопрос

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

Я хочу открыть страницу, например, facebook profile 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 как permalink

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

Ответ 4

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

Ответ 5

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

Ответ 6

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

Ответ 7

Есть много разных способов сделать это. Один из способов - использовать методы 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']));

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

Ответ 8

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

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

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

Это RESTful framework в PHP