2010-05-28 12 views
6

Ho notato che alcuni siti (tra cui il vecchio http://careers.stackoverflow.com 1.0) hanno stringhe di query che assomigliano a questo:Qual è la differenza tra/123 e /? 123?

http://somewebapp.example/?123

rispetto a:

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

Quali sono i motivi per cui gli sviluppatori scelgono di implementare gli URL delle loro app Web utilizzando il primo esempio anziché il secondo e il terzo esempio?

E come bonus implementare il primo esempio in PHP, dato che 123 è la chiave primaria di alcune righe in una tabella di database? (Ho solo bisogno di sapere come recuperare 123 dall'URL, so già come interrogare il database per una chiave primaria di 123.)

EDIT [5/28]: Ops, ha dimenticato di far sapere a tutti che so quali sono gli ultimi due URL, come funzionano e come implementarli. Grazie comunque per i ricordi, penso di avere alcuni equivoci non correlati che sono stati chiariti in modo serendipitoso comunque!

risposta

9

Il primo è più semplice da implementare; tutto dopo il? fa parte della stringa di query. Il server Web carica la stringa specificata prima di? E gestisce la stringa di query separatamente (in PHP è accessibile tramite $_GET)

Nel secondo esempio lo sviluppatore deve impostare il server Web per reindirizzare tutte le richieste a una pagina speciale (dal momento che non v'è alcun /123 pagina sul server), che sarà quindi analizzare l'URL di capire che cosa è stato richiesto

quanto alla tua ultima domanda, la 123 verranno visualizzati in $_GET come una chiave, in modo da key($_GET) avrebbe funzionato assumendo è l'unica cosa che stai passando nella stringa di query

+0

Grazie per aver risposto a entrambe le domande. Non si rendeva conto che era così semplice afferrare la chiave – BoltClock

0

Il primo esempio è una stringa di query; il secondo e il terzo esempio non lo sono. Ulteriori informazioni sugli URL da What Every Developer Should Know About URLs. Per utilizzare l'id dalla stringa di query, è necessario analizzarlo utilizzando una libreria appropriata.

0

Quali sono i motivi per cui gli sviluppatori scelgono di implementare gli URL delle loro app Web utilizzando il primo esempio anziché il secondo e il terzo esempio?

Estetica. Maggiori informazioni su cool URIs per ottenere alcuni buoni consigli su come progettare gli URI.

come si potrebbe realizzare il primo esempio in PHP

Siete alla ricerca di $_SERVER['PATH_INFO'] ma attenzione: alcuni fornitori di hosting mettere roba fasulla in là.

In queste situazioni, è necessario utilizzare mod_rewrite o simile ..

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

In questo modo, è possibile ottenere l'ID di $_GET['id']

+0

E 'puramente per farli risaltare dai soliti URL 'PATH_INFO' che sono così comuni al giorno d'oggi? – BoltClock

0

ha questo in realtà a che fare con le regole o configurazioni modRewrite apache. Alcuni framework come Code Ignitor usano questi percorsi per indirizzarti verso una pagina che in realtà non esiste tecnicamente in quella posizione fisica. Viene analizzato e il framework determina quale visualizzazione è appropriata per la visualizzazione. Alcune regole consentono al server Web di passare qualsiasi cosa dopo/come parametro per determinare se è disponibile una rotta valida dal framework. Alcuni sistemi non lo fanno automaticamente e quindi viene posto un punto interrogativo per costringerlo a passare al framework come il percorso

Se si desidera ottenere il 123 dalla prima istanza è necessario tirare la query query_string

1

è possibile accedervi da PHP utilizzando

$_SERVER['QUERY_STRING'] 
1

Il primo URL sta usando parametri di query per inviare i dati. La successiva è una forma di URL REST che in realtà punta a una risorsa con ID 123

0

Se si utilizza Apache (e si può fare lo stesso su altri server, ma non conosco i dettagli), qualcosa lungo queste linee faranno un trucchetto interessante:

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

regola: se la pagina richiesta non è un file !-f o di una directory !-d allora, invece di dare un errore di page not found, carico index.php e passare il percorso richiesto su quella script il modulo $_SERVER['PATH_INFO'] (può anche essere estratto da $_SERVER['REQUEST_URI'].

Oppure si potrebbe dire a Apache di riscrivere su index.php?$1, nel qual caso il percorso potrebbe essere estratto da $_SERVER['QUERY_STRING']. (In tal caso, è necessario utilizzare l'argomento QSA per aggiungere la stringa di query corrente (se presente) senza apportare problemi.

Problemi correlati