2012-02-02 16 views
6

tej pory robiłem to:Użytkownika przyjazne adresy URL - MOD przepisujące i php przekierowania

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

Wtedy na mojej stronie indeksu (w katalogu głównym) Używam PHP aby ustalić, która strona do obciążenia:

// 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(); 

Wszystko dotąd działa, ale użytkownicy mogą przesyłać zdjęcia do galerii i chcę je oglądać tak:

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

ale jeśli wpisałeś to jako adres URL, a przepisanie brzmi: [username]/gallery/ jako jedna sekcja, co oznacza $load = [username]/gallery, co dałoby mi "404".

Nie ma chyba lepsze rozwiązanie do uzyskania pożądanych wyników, ale nie jestem zbyt dobry z .htaccess i przepisywanie. Chciałbym dodać, że lubię ten przepisać zbyt ponieważ mam podkatalogi zwane signup i signin których oba mają w nich zbyt podkatalogów, ale jeśli pójdę do adresu URL:

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

on ignoruje przepisać i idzie do katalogu, zamiast uruchamiać go poprzez instrukcje $load, czego chcę.

także, aby pamiętać, że na rejestracji konta dowolną nazwę użytkownika, która pasuje ciągi takie jak dashboard lub about etc to nie pozwala im go używać, to zatrzymuje się nazwy użytkowników i $load if/else i ich obejmuje mieszane up itp

EDIT

Inną rzeczą zapomniałem zwrócić uwagę na to, ponieważ mogą one wywołać galerię co im się podoba, to musi zrobić wyszukiwania, aby sprawdzić, czy galeria istnieje, więc na przykład:

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

Byłoby najpierw trzeba sprawdzić nazwę użytkownika istnieje, a następnie zaznacz album istnieje, a następnie wyświetlać je, jeśli to robi lub 404/przekierować do gdziekolwiek, czy nie. Zasadniczo oba parametry/zapytania będą dynamiczne. Nie tylko to, ale potem poszczególne zdjęcia w tym albumie trzeba pracować tak samo, na przykład:

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

Mam nadzieję, że sens ...

Odpowiedz

0

Z pomocą zarówno Aatch i Sally i kilka wyników wyszukiwania w URL routingu Mam podążam za tą metodą, aby osiągnąć to, o co poszedłem, więc pomyślałem, że podzielę się nią ze wszystkimi na wypadek, gdyby ktoś chciał z niej skorzystać ...

Przede wszystkim muszę wspomnieć, że strona, nad którą pracuję, jest w ciągu 2 podkatalogi folderu głównego mysite.com/sub/folder/index.php stąd dlaczego na tablicach zaczynam od [3]

Z powiedział mój plik .htaccess jest jak następuje:

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

To, o ile jestem daleko, dostaje wszystko, co jest napisane po sub/folder/ i przekierowuje na stronę prosto do index.php, jednak , maskuje adres URL w pasku adresu.

Jedynym momentem, w którym to zignoruje, jest fakt, że katalog podrzędny faktycznie istnieje. Tak więc na przykład mam folder /sub/folder/signup/, gdybym miał go wpisać w pasku adresu, ponieważ katalog istnieje, wtedy nie przekierowywany jest do pliku index.php, ale wysyłany do żądanego katalogu, tak jak zwykle.

teraz w moim pliku index.php (Pamiętaj Zaczynam na $ uri [3], ponieważ jestem w podfolderach!)

$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'); 

przypadkach przełącznika są proste obejmuje, jeśli adres URL jest :/sub/folder/dashboard/następnie dashboard.php jest wyświetlany. Jeśli żaden z przypadków nie pasuje do siebie, prawdopodobnie moglibyśmy spojrzeć na profil. Pierwszy sprawdza, czy może to być nazwa użytkownika, jeśli istnieje, to jest wyświetlana strona profilu widoku. Następnie sprawdza, czy może to być unikalny numer ID dla tego profilu i czy robi to samo.

Na koniec, jeśli żaden z wyników nie przyniesie żadnych wyników, zostanie wyświetlona strona Nie znaleziono strony 404.

Jeśli była to strona profilu, na plik profile.php mogę następnie uruchomić sprawdza $var_two i sprawdzić, czy mają uploaded album pod tą nazwą, na przykład /sub/folder/joe/holiday/ jeśli tak, to uruchomić kwerendę, aby ją pobrać wszystko, jeśli nie, wyświetla komunikat/przekierowanie lub cokolwiek innego.

Następnie, jeśli jest ich więcej, powiedz konkretne zdjęcie ($var_three) w tym folderze ($var_two), na przykład /sub/folder/joe/holiday/beach/ - następnie uruchom je za pomocą podobnego zapytania z wynikami.

To może nie być najlepsza metoda, ale jest całkiem prosta i wszystko działa tak, jakbym tego chciała, więc nie mogę narzekać.

2

Co chcesz, co jest znane jako router URL wymaga to analizy adresu URL i podejmowania decyzji na podstawie zawartości. Większość systemów to zrobić poprzez uzyskanie cię zapewnić szablon URL, a funkcja zadzwonić, jeśli adres URL pasuje. Ta funkcja jest zwykle przekazywana do wszelkich dopasowań podrzędnych w szablonowym adresie URL.

Na przykład Django używa regexes za routing URL i przekazuje nazwanych mecze jako argumenty danej funkcji (lub klasy).

Jeśli jest to zbyt skomplikowane dla swoich potrzeb, możesz po prostu użyć do analizowania konkretnych regexes url Twoja galeria sprawa będzie:

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

można użyć $username i $gallery jednak chcesz.

Uwaga

Powyższe zakłada, że ​​będzie to mecz, trzeba będzie sprawdzić wartość zwracaną preg_match się upewnić. Ponadto nie sprawdzałem wyrażeń regularnych, może to być niepoprawne lub korzystałem z funkcji nie w tej składni.

odniesienia

+0

Trochę podniosłem wzrok na temat tego adresu URL, nigdy o nim nie słyszałem, ale wymyśliłem przyjemny sposób wykorzystania jego fragmentów, a także kilka pomysłów z odpowiedzi, które zarówno ja, jak i sally daliśmy mi. . Mam zamiar napisać to w odpowiedzi, aby pokazać, jak mam działa. +1 za pomoc! – Joe

3

Prostym rozwiązaniem byłoby: 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] 

Teraz część PHP (dla 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; 
} 

Mam nadzieję, że to będzie pomoc :)

+0

Jak już powiedziałem w odpowiedzi Aatcha, skorzystałem z pomocy zarówno ciebie, jak i Aatch, a także kilku artykułów na temat routingu adresów URL, o których wspominał Aatch. Piszę teraz odpowiedź, aby pokazać, co mam. Dziękuję za twoją pomoc +1 – Joe

0

Oto prosty przykład zacząć:

.htaccess

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

Po pierwsze, należy odmówić dostępu do bezpośredniego .php plików, można umieścić je w osobnym folderze jak „/ includes 'i przekierować dowolne połączenie do tego folderu do index.php. Po drugie, zezwól na bezpośredni dostęp do plików (takich jak obrazy lub javascripts). Ostatnia reguła, przekieruj wszystko do index.php.

PHP

Zasadniczo trzeba mieć zestaw zasad do testowania URL i jakiś kontroler obsłużyć wynik.

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)", // e.g. '/about' 
    'gallery' => "/(?'username'[\w\-]+)/gallery", // e.g. '/some-user/gallery' 
    'album' => "/(?'username'[\w\-]+)/(?'album'[\w\-]+)", // e.g. '/some-user/some-album' 
    'picture' => "/(?'username'[\w\-]+)/(?'album'[\w\-]+)/(?'picture'[\w\-]+)",  // e.g. '/some-user/some-album/some-picture' 
    'home' => "/" // e.g. '/' 
    ); 

// 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'); 

Następnym krokiem jest sprawdzenie odebranych parametrów.

Powiązane problemy