2010-05-28 12 views
6

he notado que algunos sitios (incluyendo el antiguo http://careers.stackoverflow.com 1.0) tienen cadenas de consulta que se ven así:¿Cuál es la diferencia entre/123 y /? 123?

http://somewebapp.example/?123

en comparación con:

http://somewebapp.example/123 o http://somewebapp.example/id/123

¿Cuáles son ¿Por qué los desarrolladores eligen implementar las URL de sus aplicaciones web usando el primer ejemplo en lugar del segundo y el tercer ejemplo?

Y, como beneficio adicional, ¿cómo se implementaría el primer ejemplo en PHP, dado que 123 es la clave principal de alguna fila en una tabla de base de datos? (Sólo hay que saber cómo recuperar 123 de la URL; ya sé cómo consultar la base de datos para una clave principal de 123.)

EDITAR [5/28]: Vaya, se olvidó de que todos sepan que sé cuáles son las dos últimas URL, cómo funcionan y cómo implementarlas. Sin embargo, gracias por los recordatorios, creo que tuve algunos malentendidos no relacionados que de todos modos se aclararon fortuitamente.

Respuesta

9

La primera es más fácil de implementar; todo después de? es parte de la cadena de consulta. El servidor web carga la página especificada antes de? Y maneja la cadena de consulta por separado (en PHP es accesible a través de $_GET)

En el segundo ejemplo, el desarrollador necesita configurar el servidor web para redirigir todas las solicitudes a una página especial (puesto que no hay /123 página en el servidor), que a su vez analizar la URL de averiguar lo que fue solicitado

en cuanto a su última pregunta, la 123 se mostrará en $_GET como una clave, por lo key($_GET) funcionaría asumiendo es lo único que está pasando en la cadena de consulta

+0

¡Gracias! Aceptado por responder ambas preguntas. No me di cuenta de que era tan simple de tomar la tecla . – BoltClock

0

El primer ejemplo es una cadena de consulta; el segundo y el tercer ejemplo no lo son. Obtenga más información sobre las URL en What Every Developer Should Know About URLs. Para usar el ID de la cadena de consulta, necesita analizarlo usando una biblioteca apropiada.

0

¿Cuáles son las razones por las que los desarrolladores eligen implementar las URL de sus aplicaciones web utilizando el primer ejemplo en lugar del segundo y el tercer ejemplo?

Aesthetics. Lea acerca de cool URIs para obtener algunos buenos consejos sobre cómo diseñar URI.

¿cómo se implementar el primer ejemplo en PHP

Usted está buscando $_SERVER['PATH_INFO'] pero cuidado: algunos proveedores de alojamiento poner cosas falsas en ese país.

En esas situaciones, necesitará usar mod_rewrite o similar ..

RewriteEngine On 
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteRule ^(\d+) /index.php?id=$1 [L,QSA] 

De esta manera, se puede obtener el ID de $_GET['id']

+0

¿Es solo para hacer que se destaquen de las habituales URL "PATH_INFO" que son tan comunes hoy en día? – BoltClock

0

En realidad, esto tiene que ver con las reglas modrewrite o configuraciones de Apache. Algunos marcos como Code Ignitor usan estas rutas para dirigirlo a una página que realmente no existe técnicamente en esa ubicación física. Se analiza y el marco determina qué vista es apropiada para mostrar. Algunas reglas permiten que el servidor web pase algo después de/como parámetro para determinar si hay una ruta válida disponible desde el marco. Algunos sistemas no hacen esto automáticamente y, por lo tanto, se coloca un signo de interrogación para forzar que se pase al marco como la ruta

Si desea obtener el 123 de la primera instancia, necesita obtener la solicitud query_string

1

puede acceder a él desde PHP usando

$_SERVER['QUERY_STRING'] 
1

El primer URL está utilizando parámetros de consulta para enviar los datos. La última es una forma de REST URL que en realidad apunta a un recurso con ID 123

0

Si está usando Apache (y puede hacer lo mismo en otros servidores, pero no conozco los detalles), algo a lo largo de estas líneas se hacen un truco interesante:

<IfModule mod_rewrite.c> 
    RewriteEngine on 
    RewriteCond %{REQUEST_FILENAME} !-f 
    RewriteCond %{REQUEST_FILENAME} !-d 
    RewriteRule ^(.+)$ index.php/$1 
</IfModule> 

regla: si la página solicitada no es un archivo !-f o un directorio !-d entonces, en lugar de dar un error de page not found, carga index.php y pasan la ruta solicitada en esa secuencia de comandos en la forma de $_SERVER['PATH_INFO'] (también se puede extraer de $_SERVER['REQUEST_URI'].

O podría decirle a Apache que reescriba a index.php?$1, en cuyo caso la ruta podría extraerse de $_SERVER['QUERY_STRING']. (En ese caso, debe usar el argumento QSA para anexar la cadena de consulta actual (si corresponde) sin estropear nada.

Cuestiones relacionadas