Переписывание URL с помощью PHP


у меня есть URL, который выглядит так:

url.com/picture.php?id=51

Как бы я пошел о преобразовании этого URL:

picture.php/Some-text-goes-here/51

Я думаю, что WordPress делает то же самое.

Как мне сделать дружественные URL-адреса в PHP?

5 117

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]

этот файл имеет четыре директивы:

  1. RewriteEngine - включить механизм перезаписи
  2. RewriteRule - запретить доступ ко всем файлам в inc/ папка, перенаправьте любой вызов в эту папку на index.php
  3. RewriteCond - разрешить прямой доступ ко всем другим файлам (например, изображения, css или скрипты )
  4. 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 как приложение для перенаправления.