Domanda

Alla fine ho trovato un modo buono / facile fare gli URL pulite con espressioni regolari sul mio sito in questo formato di seguito, tuttavia richiederà un grande file .htaccess, so che dal post qui che si suppone di non quella di cattiva sulle prestazioni di utilizzare mod_rewrite ma non ho mai realmente visto utilizzato dove il mio modo, con una voce separata per quasi ogni pagina del mio sito.

Di seguito è un esempio di una voce, v'è 2 voci per 1 pagina, la prima voce riscritture

http://www.example.com/users/online/friends /
a
  http://www.example.com/index.php ? p = users.online.friends

E le grandi opere, ma se l'utente non è sulla prima pagina poi c'è un'altra cosa aggiunto all'URL per il paging e ho dovuto scrivere un altro ingresso a riscrivere quando questo accade, è questo il modo corretto o dovrebbe questi essere combinati in qualche modo?

RewriteRule ^users/online/friends/*$ ./index.php?p=users.online.friends&s=8
RewriteRule ^users/online/friends/(\d+)/*$ ./index.php?p=users.online.friends&s=8&page=$1

La seconda farebbe questo

http://www.example.com/users/online / amici / 22 /
a
  http://www.example.com/index .php? p = users.online.friends & page = 22

È stato utile?

Soluzione

Dipende da quello che si pensa è più leggibile, ma ecco come si potrebbe fare con una sola regola:

RewriteRule ^users/online/friends(/(\d+))?/*$ ./index.php?p=users.online.friends&s=8&page=$2

( A cura per essere più fedeli al trattamento di slash in questione originale è stato:.? RewriteRule ^ utenti / linea / amici / ((\ d +) / *) $ ./ index.php? p = users.online.friends & s = 8 & page = $ 2 )

Qui ho appena messo "(...)?" intorno alla parte finale del URL per renderlo partite facoltativa, e ha cambiato il backreference a $ 2.

Naturalmente, questo riscrive in realtà http://www.domain.com/users/ on-line / amici / come:

http://www.domain.com /index.php?p=users.online.friends&page=

Così il vostro codice PHP avrebbe dovuto verificare se il parametro della pagina non è vuota.

Altri suggerimenti

Sì, va bene. Credo che potrebbero essere combinate in una singola regola, ma non c'è davvero alcun bisogno.

Si potrebbe considerare di lasciare la pagina come parte dell'URL così invece di:

http://www.domain.com/users/online/friends/22/

semplicemente:

http://www.domain.com/users/online/friends?page=22

e poi hanno una regola qualcosa del tipo:

RewriteRule ^users/online/friends/?$ ./index.php?p=users.online.friends&s=8 [L,QSA]

per aggiungere la stringa di query

Modifica:. Ci sono un paio di modi per ridurre il numero di regole di riscrittura avete

In primo luogo, utilizzare i caratteri jolly nei termini di ricerca, come:

RewriteRule ^users/(\w+)/(\w+)$ /index.php?p=users.$1.$2 [L,QSA]

ridurrà un certo numero di regole.

In secondo luogo, se si sta passando tutto attraverso index.php basta considerare delegare tutte le richieste c'è:

RewriteRule ^(users/*)$ /index.php/$1 [L,QSA]

Questa regola utilizza una terza tecnica: invece di passare le informazioni sul percorso tramite un parametro di stringa di query, passare tramite le informazioni di percorso in più. Che si può accedere tramite $_SERVER['PATH_INFO'].

Detto questo, un sacco di regole non è necessariamente un male. Almeno è esplicito su tutte le vostre azioni. La cosa che dovete guardare fuori per è la creazione di un incubo di manutenzione però.

# Initial step
RewriteCond %{QUERY_STRING} !(?:^|&)p=
RewriteRule ^([^/]+)/(.+) /$2?p=$1 [QSA]

# Subsequent steps
RewriteCond %{QUERY_STRING} ((?:[^&]*&)*?)p=([^&]*)(.*)
RewriteRule ^([^/]+)/(.+) /$2?%1p=%2.$1%3

# Last step with page number
RewriteRule ^(\d+)/?$ /index.php?page=$1 [QSA,L]

# Last step without page number
RewriteCond %{QUERY_STRING} (?:((?:[^&]*&)*?)p=([^&]*))?(.*)
RewriteRule ^([^/]+)/?$ /index.php?%1p=%2.$1%3 [L]

Questo sarebbe riscrivere l'URL in più passaggi:

  1. http://www.domain.com/users/online/friends/22/
  2. http://www.domain.com/online/friends/22/?p=users
  3. http://www.domain.com/friends/22/?p=users.online
  4. http://www.domain.com/22/?p=users.online.friends
  5. http://www.domain.com/index.php?p=users.online.friends&page=22

Un metodo più semplice sarebbe la seguente, ma si richiederebbe di modificare i vostri script:

RewriteRule ^(.*?)(?:/(\d+))?/?$ /index.php?p=$1&page=$2 [QSA,L]

E 'avrebbe fatto tutto in un unico passaggio, con una piccola differenza:

  1. http://www.domain.com/users/online/friends/22/
  2. http://www.domain.com/index.php?p=users/online/friends&page=22

L'aggiunta l'argomento interrogazione s=8 richiederebbe più lavoro:

  1. La creazione di un file di testo con i numeri di menu per ogni pagina.
  2. Aggiunta di una direttiva RewriteMap.
  3. Modifica della penultima regola per utilizzare lo stesso RewriteCond come l'ultima regola ha.
  4. Aggiunta &s=%{menumap:%2|0} alle ultime due regole.
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top