2012-02-02 18 views
6

Hasta ahora me han hecho esto:Usuario - mod de reescritura y php redirecciones

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

Entonces en mi página de índice (en el directorio raíz) Estoy usando PHP para determinar la página de carga:

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

Todo hasta ahora está funcionando pero los usuarios pueden subir fotos a una galería y quiero que sean vistos como tan:

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

pero si debes escribir eso como la URL que reescribe [username]/gallery/ como una sección que significa $load = [username]/gallery que me daría un '404'.

Probablemente haya una mejor solución para obtener los resultados deseados, pero no soy demasiado bueno con .htaccess y reescritura. Me gustaría añadir que me gusta esta reescritura demasiado ya que tengo subdirectorios llamados signup y signin el que ambos tienen subdirectorios en ellos también, pero si voy a la URL:

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

Se ignora la reescritura y va al directorio en lugar de ejecutarlo a través de las declaraciones $load que es lo que quiero.

Además, tenga en cuenta que, en el registro de una cuenta, cualquier nombre de usuario que coincide con cadenas como dashboard o about etc no les permiten utilizar, esto deja de nombres de usuario y la $load if/else declaraciones y su incluye ser mezclado hasta etc.

EDITAR

Otra cosa que me olvidé de tener en cuenta es, ya que pueden llamar a la galería lo que quieran, que tiene que hacer una búsqueda para ver si existe esa galería, así por ejemplo:

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

Primero debería verificar que el nombre de usuario existe, luego verificar que el álbum existe, luego mostrarlo si lo hace o 404/redireccionar a donde sea que no lo haga. Entonces, básicamente, ambos parámetros/consultas serán dinámicos. No sólo eso, pero luego las fotos individuales dentro de ese álbum tienen que funcionar de la misma, por ejemplo:

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

espero que tenga sentido ...

Respuesta

0

Con la ayuda de tanto unos resultados de búsqueda en el enrutamiento de URL Aatch y Sally y, tengo la siguiendo el método para lograr lo que buscaba, así que pensé en compartirlo con todos en caso de que alguien quisiera usarlo ...

Antes que nada, debo mencionar que el sitio en el que estoy trabajando está dentro de 2 subdirectorios de la carpeta raíz mysite.com/sub/folder/index.php por lo tanto, ¿por qué en las matrices que estoy comenzando desde [3]

Dicho mi archivo .htaccess es como sigue:

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

Esto, por lo que yo estoy fuera, se pone todo lo que está escrito después sub/folder/ y redirige la página directamente a la index.php, sin embargo , enmascara la URL en la barra de direcciones.

La única vez que ignora esto es si realmente existe el subdirectorio. Entonces, por ejemplo, tengo una carpeta /sub/folder/signup/ si tuviera que escribir eso en la barra de direcciones, porque el directorio existe, entonces no se lo redirige al archivo index.php, sino que se lo envía al directorio solicitado, como siempre.

Ahora en mi archivo index.php (recuerde que estoy empezando en $ uri [3] porque estoy en sub carpetas!)

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

Los casos son simples interruptores incluye, si la URL :/sub/folder/dashboard/then dashboard.php se muestra. Si ninguno de los casos coincide, entonces posiblemente podríamos estar buscando un perfil. El primero comprueba si podría ser un nombre de usuario, si existe, se muestra la página de perfil de vista. Luego, verifica si podría ser el número de identificación único para ese perfil y realiza el mismo control.

Finalmente, si no se obtienen resultados de ninguno de ellos, se muestra una página de 404 páginas no encontradas.

Si se trata de una página de perfil, en el archivo profile.php entonces puedo ejecutar comprobaciones de $var_two y ver si han subido un álbum de fotos con ese nombre, por ejemplo /sub/folder/joe/holiday/ en caso afirmativo, a continuación, ejecutar una consulta a buscarla todo, si no, muestra un mensaje/redirección o lo que sea.

Entonces, si hay aún más, dicen que una imagen específica ($var_three) en esa carpeta ($var_two), por ejemplo /sub/folder/joe/holiday/beach/ - a continuación, ejecute a través de una consulta similar que muestra los resultados.

Puede que no sea el mejor método, pero es bastante directo y todo funciona como me gustaría, así que no me puedo quejar.

2

Lo que queremos es lo que se conoce como un enrutador URL, esto requiere que analice la url y tome decisiones basadas en los contenidos. La mayoría de los sistemas hacen esto al hacer que proporciones una plantilla de URL y una función para llamar si la url coincide. Por lo general, la función pasa las subclases en la url de la plantilla.

Por ejemplo, Django usa expresiones regulares para su enrutamiento url y pasa las coincidencias nombradas como argumentos para una función (o clase) dada.

Si esto es demasiado complejo para sus necesidades a continuación, puedes utilizar expresiones regulares específicas para analizar la URL, su caso sería galería:

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

a continuación, puede utilizar $username y $gallery como desee.

Nota

Lo anterior presupone que va a coincidir, tendrá que comprobar el valor de retorno de preg_match para asegurarse. Además, no he comprobado la expresión regular, puede ser incorrecta, o uso funciones que no están en esta sintaxis.

Referencia

+0

He consultado un poco sobre este enrutamiento de URL, nunca había oído hablar de él, pero he encontrado una buena manera de usar fragmentos de él, así como algunas ideas de las respuestas que tanto tú como Sally me han dado . Estoy a punto de escribirlo en una respuesta para mostrar cómo tengo las cosas en funcionamiento. +1 por tu ayuda! – Joe

3

Una solución sencilla sería: EDITAR 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] 

Ahora que parte de PHP (por 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; 
} 

Es de esperar que va a ayudar :)

+0

Como acabo de decir en la respuesta de Aatch, he utilizado la ayuda de usted y Aatch, así como algunos artículos sobre enrutamiento de URL que Aatch mencionó. Estoy escribiendo una respuesta ahora para mostrar lo que tengo. Gracias por tu ayuda +1 – Joe

0

aquí es simple ejemplo, para empezar:

.htaccess

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

En primer lugar, debe denegar el acceso directo a .php archivos, puede ponerlos en carpeta separada como '/ includes y redirija cualquier llamada a esa carpeta a index.php. En segundo lugar, permite el acceso directo a archivos (como imágenes o javascripts). Última regla, redirecciona cualquier otra cosa a index.php.

PHP

Básicamente, usted debe haber un conjunto de reglas para probar URL y algunos controlador para manejar el resultado.

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

El siguiente paso es verificar los parámetros recibidos.