Пока я это сделал:
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
чтобы убедиться. Кроме того, я не проверял регулярное выражение, это может быть неправильно или использовать функции, не входящие в этот синтаксис.
Справка
С помощью как 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' );
Следующий шаг – проверить полученные параметры.