Intereting Posts
Как проверить тип даты в массиве в PHP Как вставить данные в таблицу1 с полем проверки из таблицы2 (Codeigniter) (обновлено) За кулисами: Как ОРМ «думает»? Ошибка анализа: ошибка синтаксиса, неожиданный T_BOOLEAN_AND, ожидающий '(' in Неправильный URL-адрес при выполнении запроса mysql (не следуя инструкциям по расположению заголовка php) Создание сервера сокетов PHP для игры Значение переменной приращения php с 1 при отправке PHP – прекратить отображение полного пути в ошибках Классы рамки Laravel недоступны в поставщике данных PHPUnit автоматически создать кнопку покупки сейчас paypal? Загружать session_start () только в том случае, если сеанс не существует? IN WordPress, .php файлы в папке темы не запускаются, но возвращают ошибку 404 Что делать, если (); do, где точка с запятой сразу после круглых скобок? laraval queue daemon mail перестает работать с ошибкой SSL Ошибка Javascript и php

Дружественные URL-адреса – переписывание мод и переадресация php

Пока я это сделал:

RewriteBase / RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule ^(.*)$ index.php?load=$1 [QSA,L] 

Затем на моей индексной странице (в корневом каталоге) я использую PHP для определения загружаемой страницы:

 // Swap to variables $load = $_GET['load']; // Home page if (!$load || $load == "") { include('home.php'); exit(); } // Dashboard if ($load == "dashboard") { include('dashboard.php'); exit(); } // About if ($load == "about") { include('about.php'); exit(); } // Username $data_array = array(':username' => $load); $select_account = $connect->prepare("SELECT * FROM `users` WHERE `username` = :username"); $select_account-> execute($data_array); $account_amount = $select_account->rowCount(); if ($account_amount > 0) { include('profile.php?name=$load'); exit(); } // Redirect to 404 if there are no results include('404.php'); exit(); 

Все до сих пор работает, но пользователи могут загружать фотографии в галерею, и я хочу, чтобы они выглядели так:

 www.mysite.com/[username]/gallery/ 

Но если бы вы набрали это как url, переписывание читает [username]/gallery/ как один раздел, который означает $load = [username]/gallery который дал бы мне «404».

Вероятно, есть лучшее решение для получения желаемых результатов, но я не слишком хорош с .htaccess и переписыванием. Я хотел бы добавить, что мне тоже нравится этот переписывать, так как у меня есть подкаталоги, называемые signup и signin которых оба имеют подкаталоги в них тоже, но если я signin к URL-адресу:

 www.mysite.com/signup www.mysite.com/signin 

Он игнорирует переписывание и переходит в каталог вместо того, чтобы запускать его через инструкции $load которые я хочу.

Кроме того, чтобы отметить, что при регистрации учетной записи, любое имя пользователя, которое соответствует строкам, таким как dashboard или about т. Д., Не позволяет им использовать его, это останавливает имена пользователей и инструкции $load if / else, а также их включение в замешательство и т. Д.

РЕДАКТИРОВАТЬ

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

 www.mysite.com/username/my+first+album 

Сначала нужно проверить, существует ли имя пользователя, а затем проверить, существует ли альбом, а затем отображать его, если он есть, или 404 / перенаправить туда, где это возможно, если это не так. Таким образом, оба параметра / запроса будут динамическими. Не только это, но и отдельные фотографии в этом альбоме должны работать одинаково, например:

 www.mysite.com/username/my+first+album/my+picture 

Надеюсь это имеет смысл…

Простое решение: EDIT HTACCESS

 RewriteBase / RewriteCond %{REQUEST_URI} !/signup RewriteCond %{REQUEST_URI} !/signin RewriteRule ^([^/]*)/([^/]*)$ index.php?load=gallery&username=$1&gallery=$2 RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule ^(.*)$ index.php?load=$1 [QSA,L] 

Теперь, когда часть PHP (для index.php):

 $load = $_GET['load']; switch ($load){ default: include('home.php'); exit(); break; case 'dashboard': include('dashboard.php'); exit(); break; case 'about': include('about.php'); exit(); break; case 'gallery': $username = $_GET['username']; $gallery = $_GET['gallery']; //check for the username and gallery header("Location: your-gallery-location-goes-here"); break; } в $load = $_GET['load']; switch ($load){ default: include('home.php'); exit(); break; case 'dashboard': include('dashboard.php'); exit(); break; case 'about': include('about.php'); exit(); break; case 'gallery': $username = $_GET['username']; $gallery = $_GET['gallery']; //check for the username and gallery header("Location: your-gallery-location-goes-here"); break; } в $load = $_GET['load']; switch ($load){ default: include('home.php'); exit(); break; case 'dashboard': include('dashboard.php'); exit(); break; case 'about': include('about.php'); exit(); break; case 'gallery': $username = $_GET['username']; $gallery = $_GET['gallery']; //check for the username and gallery header("Location: your-gallery-location-goes-here"); break; } в $load = $_GET['load']; switch ($load){ default: include('home.php'); exit(); break; case 'dashboard': include('dashboard.php'); exit(); break; case 'about': include('about.php'); exit(); break; case 'gallery': $username = $_GET['username']; $gallery = $_GET['gallery']; //check for the username and gallery header("Location: your-gallery-location-goes-here"); break; } 

Надеюсь, это поможет 🙂

То, что вы хотите, это так называемый URL-маршрутизатор, для этого требуется проанализировать URL-адрес и принять решения на основе содержимого. Большинство систем делают это, предоставляя вам шаблон url и функцию для вызова, если URL-адрес совпадает. Обычно функция передает любые подмаски в шаблоне url.

Например, Django использует регулярные выражения для маршрутизации URL-адреса и передает именованные совпадения в качестве аргументов для данной функции (или класса).

Если это слишком сложно для ваших нужд, вы можете просто использовать определенные регулярные выражения для анализа URL-адреса, и ваш случай с галереей будет выглядеть следующим образом:

 $matches = array(); $re = "/\/([\w\d])+\/([\w\d+%])+\/?/"; preg_match($re, $load, $matches); $username = $matches[0]; $gallery = $matches[1]; 

вы можете использовать $username и $gallery вам угодно.

Заметка

Вышеприведенное предполагает, что оно будет соответствовать, вам нужно будет проверить возвращаемое значение preg_match чтобы убедиться. Кроме того, я не проверял регулярное выражение, это может быть неправильно или использовать функции, не входящие в этот синтаксис.

Справка

  • Обычные выражения
  • PHP PCRE Function Documentation (PCRE = регулярные выражения, совместимые с Perl)

С помощью как Aatch, так и Sally и нескольких результатов поиска по маршрутизации URL-адресов у меня есть следующий метод для достижения того, что я был после этого, поэтому я решил поделиться им со всеми, если кто-то захочет его использовать …

Прежде всего, мне нужно упомянуть, что сайт, над которым я работаю, находится в пределах 2 подкаталогов корневой папки mysite.com/sub/folder/index.php поэтому почему на массивах я начинаю с [3]

С учетом сказанного мой файл .htaccess выглядит следующим образом:

 RewriteEngine on RewriteBase / RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule . sub/folder/index.php [QSA,L] 

Это, насколько я далеко, получает все, что написано после sub/folder/ и перенаправляет страницу обратно обратно в index.php, однако он маскирует URL-адрес в адресной строке.

Единственный раз, когда он игнорирует это, заключается в том, что подкаталог фактически существует. Например, у меня есть папка /sub/folder/signup/ если я должен был ввести ее в адресной строке, потому что каталог существует, то вы не перенаправлены в файл index.php, а отправлены в запрошенный каталог, как обычно ,

Теперь на моем файле index.php (помните, что я начинаю с $ uri [3], потому что я в подпапках!)

 $uri = $_SERVER['REQUEST_URI']; // This brings back /sub/folder/foo/bar/test/ $uri = explode("/", $uri); // Separate each one $var_one = $uri[3]; // foo $var_two = $uri[4]; // bar $var_three = $uri[5]; // test switch ($var_one) { case '': case 'home': include('home.php'); exit(); break; case 'signout': case 'logout': include('signout.php'); exit(); break; case 'dashboard': case 'dash': include('dashboard.php'); exit(); break; } // By Username $data_array = array(':username' => $var_one); $select_account = $connect->prepare("SELECT * FROM `users` WHERE `username` = :username"); $select_account -> execute($data_array); $account_amount = $select_account->rowCount(); if ($account_amount > 0) { include('profile.php'); exit(); } // By Account ID $data_array = array(':id' => $var_one); $select_account = $connect->prepare("SELECT * FROM `users` WHERE `id` = :id"); $select_account -> execute($data_array); $account_amount = $select_account->rowCount(); if ($account_amount > 0) { include('profile.php'); exit(); } include('page_not_found.php'); в $uri = $_SERVER['REQUEST_URI']; // This brings back /sub/folder/foo/bar/test/ $uri = explode("/", $uri); // Separate each one $var_one = $uri[3]; // foo $var_two = $uri[4]; // bar $var_three = $uri[5]; // test switch ($var_one) { case '': case 'home': include('home.php'); exit(); break; case 'signout': case 'logout': include('signout.php'); exit(); break; case 'dashboard': case 'dash': include('dashboard.php'); exit(); break; } // By Username $data_array = array(':username' => $var_one); $select_account = $connect->prepare("SELECT * FROM `users` WHERE `username` = :username"); $select_account -> execute($data_array); $account_amount = $select_account->rowCount(); if ($account_amount > 0) { include('profile.php'); exit(); } // By Account ID $data_array = array(':id' => $var_one); $select_account = $connect->prepare("SELECT * FROM `users` WHERE `id` = :id"); $select_account -> execute($data_array); $account_amount = $select_account->rowCount(); if ($account_amount > 0) { include('profile.php'); exit(); } include('page_not_found.php'); в $uri = $_SERVER['REQUEST_URI']; // This brings back /sub/folder/foo/bar/test/ $uri = explode("/", $uri); // Separate each one $var_one = $uri[3]; // foo $var_two = $uri[4]; // bar $var_three = $uri[5]; // test switch ($var_one) { case '': case 'home': include('home.php'); exit(); break; case 'signout': case 'logout': include('signout.php'); exit(); break; case 'dashboard': case 'dash': include('dashboard.php'); exit(); break; } // By Username $data_array = array(':username' => $var_one); $select_account = $connect->prepare("SELECT * FROM `users` WHERE `username` = :username"); $select_account -> execute($data_array); $account_amount = $select_account->rowCount(); if ($account_amount > 0) { include('profile.php'); exit(); } // By Account ID $data_array = array(':id' => $var_one); $select_account = $connect->prepare("SELECT * FROM `users` WHERE `id` = :id"); $select_account -> execute($data_array); $account_amount = $select_account->rowCount(); if ($account_amount > 0) { include('profile.php'); exit(); } include('page_not_found.php'); в $uri = $_SERVER['REQUEST_URI']; // This brings back /sub/folder/foo/bar/test/ $uri = explode("/", $uri); // Separate each one $var_one = $uri[3]; // foo $var_two = $uri[4]; // bar $var_three = $uri[5]; // test switch ($var_one) { case '': case 'home': include('home.php'); exit(); break; case 'signout': case 'logout': include('signout.php'); exit(); break; case 'dashboard': case 'dash': include('dashboard.php'); exit(); break; } // By Username $data_array = array(':username' => $var_one); $select_account = $connect->prepare("SELECT * FROM `users` WHERE `username` = :username"); $select_account -> execute($data_array); $account_amount = $select_account->rowCount(); if ($account_amount > 0) { include('profile.php'); exit(); } // By Account ID $data_array = array(':id' => $var_one); $select_account = $connect->prepare("SELECT * FROM `users` WHERE `id` = :id"); $select_account -> execute($data_array); $account_amount = $select_account->rowCount(); if ($account_amount > 0) { include('profile.php'); exit(); } include('page_not_found.php'); 

Ключи переключателя просты включают, если url: / sub / folder / dashboard /, тогда отображается dashboard.php. Если ни один из случаев не соответствует, мы могли бы посмотреть профиль. Первая проверяет, может ли она быть именем пользователя, если она существует, отображается страница профиля представления. Затем он проверяет, может ли он быть единственным идентификационным номером для этого профиля и выполняет ту же проверку.

Наконец, если результаты не возвращаются ни с одной из них, нам будет показана страница с 404 страницами, не найденная.

Если это была страница профиля, в файле profile.php я могу запустить проверки для $var_two и посмотреть, загрузили ли они фотоальбом под этим именем, например /sub/folder/joe/holiday/ if yes, затем запустите запрос на получение всего, если нет, отображение сообщения / перенаправления или что-то еще.

Затем, если есть еще больше, скажите конкретную картинку ( $var_three ) в этой папке ( $var_two ), например /sub/folder/joe/holiday/beach/ – затем выполните ее с помощью аналогичного запроса, показывающего результаты.

Это может быть не лучший метод, но он довольно прямолинейный, и все работает так, как мне бы хотелось, так что я не могу жаловаться.

Вот простой пример для начала:

.htaccess

 RewriteEngine On RewriteRule ^includes/.*$ index.php RewriteCond %{REQUEST_FILENAME} !-f RewriteRule ^(.*)$ index.php [QSA,L] 

Во-первых, вы должны запретить прямой доступ к файлам .php, вы можете поместить их в отдельную папку, например '/ includes', и перенаправить любой вызов этой папки на index.php. Во-вторых, разрешите прямой доступ к файлам (например, изображения или javascripts). Последнее правило перенаправляет что-либо еще на index.php.

PHP

В принципе, у вас должен быть набор правил для проверки URL-адреса и некоторого контроллера для обработки результата.

 define( 'WEB_ROOT', rtrim( dirname($_SERVER["SCRIPT_NAME"]), '/' ) ); define( 'INCLUDES_ROOT', 'includes/' ); // examples of rewrite rules ( $key = action, $value = regular expression ) $rules = array( 'pages' => "/(?'page'dashboard|about|signin|signup)", // eg '/about' 'gallery' => "/(?'username'[\w\-]+)/gallery", // eg '/some-user/gallery' 'album' => "/(?'username'[\w\-]+)/(?'album'[\w\-]+)", // eg '/some-user/some-album' 'picture' => "/(?'username'[\w\-]+)/(?'album'[\w\-]+)/(?'picture'[\w\-]+)", // eg '/some-user/some-album/some-picture' 'home' => "/" // eg '/' ); // get uri $uri = '/' . trim( str_replace( WEB_ROOT, '', $_SERVER['REQUEST_URI'] ), '/' ); // test uri foreach ( $rules as $action => $rule ) { $pattern = '/^'.str_replace( '/', '\/', $rule ).'$/'; if ( preg_match( $pattern, $uri, $params ) ) { /* now you know the action and parameters so you can * include appropriate template file ( or proceed in some other way ) * NOTE: variable $params vill be visible in template ( use print_r( $params ) to see result ) */ include( INCLUDES_ROOT . $action . '.php' ); // exit to avoid the 404 message exit(); } } // nothing is found so handle 404 error include( INCLUDES_ROOT . '404.php' ); 

Следующий шаг – проверить полученные параметры.