Преактируйте приложение, используя socket.io и preact-context?

Если вы хотите изменить маршрут для 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

index.php

Поскольку все теперь перенаправлено на index.php, будет определено, правильно ли указатель, все параметры присутствуют, и если тип параметров правильный.

Чтобы проверить 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' );
1
задан user3072517 13 July 2018 в 22:41
поделиться