Abbina il punto interrogativo nella regola mod_rewrite regex

Sto cercando di riscrivere gli URL con sottostringhe multiple. Una sottostringa è richiesta come sottodirectory, mentre altre sono richieste come normali parametri della stringa di query.

Ad esempio, vorrei riscrivere gli URL di

http://www.mysite.com/mark/friends?page=2 

a

 http://www.mysite.com/friends.php?user=mark&page=2 

Sono in grado di farlo con l’eccezione del carattere del punto interrogativo. Ecco la mia regola di riscrittura:

 ... RewriteEngine On RewriteBase / RewriteRule ^([A-Za-z0-9-_]+)/friends[?]?([^/\.]+)?$ friends.php?user=$1&$2 [L] 

Se cambio il punto interrogativo in un altro personaggio, funziona alla grande. Sembra che il problema sia “?” il carattere viene interpretato erroneamente come l’inizio di una nuova stringa di query.

Devo passare tutti i parametri che appaiono dopo / user / friends così com’è. Come posso realizzare questo?

Dovresti usare il flag [QSA] invece di provare a riscrivere la stringa di query. [QSA] passa la stringa di query all’URL riscritto.

Quindi la tua regola dovrebbe essere simile a:

 ... RewriteEngine On RewriteBase / RewriteRule ^([A-Za-z0-9-_]+)/friends/? friends.php?user=$1 [QSA,L] 

Il tuo caso è molto simile all’esempio dato per l’utilizzo del flag QSA nel ricettario mod_rewrite .

La query non fa parte del percorso URL e quindi non può essere elaborata con la direttiva RewriteRule . Questo può essere fatto solo con la direttiva RewriteCond (vedi %{QUERY_STRING} ).

Ma poiché Chad Birch ha già detto che è sufficiente impostare il flag QSA per ottenere automaticamente la query richiesta originale aggiunta al nuovo URL.

Oltre a utilizzare il flag di riscrittura QSA, puoi anche utilizzare la variabile di ambiente QUERY_STRING come mostrato di seguito:

 RewriteEngine On RewriteBase / RewriteRule ^([A-Za-z0-9-_]+)/friends$ /friends.php?user=$1&%{QUERY_STRING} 

E l’URL in questione

 http://www.example.com/mark/friends?page=2 

sarà riscritto a (come specificato):

 http://www.example.com/friends.php?user=mark&page=2