ruta rewriterule redireccionar parametros index htaccess ejemplo dominio crear con carpeta amigables php mod-rewrite url-rewriting friendly-url

redireccionar - rewriterule([- a za z0 9 index php ruta=$ 1



URLs fáciles de usar: reescritura mod y redireccionamientos php (4)

Hasta ahora he hecho esto:

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

Luego en mi página de índice (en el directorio raíz) estoy usando PHP para determinar qué página cargar:

// 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 se vean así:

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

Pero si escribes eso como la url, la reescritura dice [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 también me gusta esta reescritura ya que tengo subdirectorios llamados signup y signin que también tienen subdirectorios en ellos, pero si voy a la URL:

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

Ignora la reescritura y va al directorio en lugar de ejecutarlo a través de las sentencias $load , que es lo que quiero.

Además, para tener en cuenta, al registrar una cuenta, cualquier nombre de usuario que coincida con cadenas como el dashboard o about etc. no les permite usarlo, esto detiene los nombres de usuario y las sentencias $load if / else y sus incluye ser mezclados, etc.

EDITAR

Otra cosa que olvidé mencionar es que pueden llamar a la galería lo que quieran, necesita hacer una búsqueda para ver si esa galería existe, así que por ejemplo:

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

Primero necesitaría verificar que el nombre de usuario existe, luego verificar que el álbum existe, luego mostrarlo si lo hace o 404 / redirigir a donde sea que no lo haga. Entonces, básicamente, ambos parámetros / consultas serán dinámicos. No solo eso, sino que las fotos individuales dentro de ese álbum deben funcionar igual, por ejemplo:

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

Espero que tenga sentido...


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

Ahora esa parte de PHP (para 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; }

Espero que ayude :)


Lo que quiere es lo que se conoce como un enrutador de 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 a una función (o clase) determinada.

Si esto es demasiado complejo para sus necesidades, entonces puede usar expresiones regulares específicas para analizar la url, su caso de galería sería:

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

luego puede usar $username y $gallery como lo desee.

Nota

Lo anterior supone que coincidirá, necesitará verificar 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


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

En primer lugar, 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 esto, mi archivo .htaccess es el siguiente:

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

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

La única vez que ignora esto es si realmente existe el subdirectorio. Así que, 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 te redirige al archivo index.php, sino que se envía al directorio solicitado, como normalmente .

Ahora en mi archivo index.php (¡Recuerda que estoy comenzando en $ uri [3] porque estoy en subcarpetas!)

$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 de cambio son simples incluye, si la url es: / 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 era una página de perfil, en el archivo profile.php puedo ejecutar cheques para $var_two y ver si han subido un álbum de fotos con ese nombre, por ejemplo /sub/folder/joe/holiday/ if yes, luego ejecutar una consulta para recuperarlo todo, si no, mostrar un mensaje / redirección o lo que sea.

Luego, si hay aún más, digamos una imagen específica ( $var_three ) en esa carpeta ( $var_two ), por ejemplo /sub/folder/joe/holiday/beach/ - luego ejecútela a través de una consulta similar que muestre los resultados.

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


Aquí hay un ejemplo simple para comenzar:

.htaccess

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

Primero, debe denegar el acceso directo a los archivos .php, puede ponerlos en una carpeta separada como ''/ includes'' y redirigir cualquier llamada a esa carpeta a index.php. En segundo lugar, permita el acceso directo a archivos (como imágenes o javascripts). Última regla, redireccionar cualquier otra cosa a index.php.

PHP

Básicamente debe tener un conjunto de reglas para probar la URL y algún 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.