HTTP stateless protocol (protocollo senza stato), il destinatario non deve mantenere lo stato delle richieste precedenti.
Normalmente tramite markup html si comunica con i (form) moduli e il metodo sarà di tipo GET (aggiunta alla url) o POST (richiesta corpo), o giustamente entrambe example.com/?id=40 avrà sempre la forma nome=valore e opzionalmente se con più di un valore sarà concatenato dal simbolo &. Riprendendo il primo esempio è ?id=40&name2=valore+2.
Potrai anche affidarti con l'intestazione dei cookie, per mantenere un determinato dato tra più pagine.
La sessione http in php viene offerta tramite query string o con l'intestazione cookie, giustamente php memorizza tale dato tramite file testuale o in un database così se il cliente_id effettua una richiesta sarà ricordato per usi successivi.
Su Windows dovrebbe esserci un limite per la richiesta GET di 256 byte, dovrai scegliere e strutturare al meglio i tuoi dati già in partenza.
Per rispondere alla tua domanda, certo se ogni pagina contiene una query string, giustamente passi il valore per ogni pagina e potrai recuperarlo dopo con $_REQUEST['id'], poiché fai affidamento da variabili manipolabili dall'esterno dovrai usare isset() per verificare se la variabile esiste e in alcuni casi controllare il valore se è ciò che ti aspetti.
Nb* in assenza o con enctype application/x-www-form-urlencoded si usa la codifica Percent Encoding, il simbolo dello spazio ad esempio è trasformato nel simbolo +, come nel mio secondo esempio per la seconda stringa name2. $_GET, $_POST, $_REQUEST e $_COOKIE effettuano la riconversione, chiamata decodifica e quindi il valore sarà lo spazio invece del simbolo +.