Domanda

Sto costruendo un sito Web abbastanza grande e il mio .htaccess sta iniziando a sentirsi un po 'gonfio, c'è un modo per sostituire il mio attuale sistema di - una regola per ciascuno dei possibili numeri di var che potrebbero essere passati, a uno cattura tutte le espressioni che possono rappresentare un numero variabile di input?

ad esempio attualmente ho:

RewriteRule ^([a-z]+)/([^/]*)/([^/]*)/([^/]*)/([^/]*)/([^/]*)$ /index.php?mode=$1&id=$2&$3=$4&$5=$6
RewriteRule ^([a-z]+)/([^/]*)/([^/]*)/([^/]*)$ /index.php?mode=$1&id=$2&$3=$4
RewriteRule ^([a-z]+)/([^/]*)$ /index.php?mode=$1&id=$2
RewriteRule ^([a-z]+)$ /index.php?mode=$1

il primo backreference è sempre la modalità e (se ce ne sono altri) il secondo è sempre id , da allora in poi eventuali ulteriori riferimenti indietro si alternano tra il nome dell'input e il suo valore

http://www.example.com/search
http://www.example.com/search/3039/sort_by/name_asc/page/23

Mi piacerebbe poter avere un'espressione per gestire con grazia tutti gli input.

È stato utile?

Soluzione

Fai come Drupal:

  RewriteCond %{REQUEST_FILENAME} !-f
  RewriteCond %{REQUEST_FILENAME} !-d
  RewriteRule ^(.*)$ index.php?q=$1 [L,QSA]

E poi gestisci tutte le cose nel tuo script usando il codice php qualcosa del genere

$pathmap = ();
if (

Fai come Drupal:

  RewriteCond %{REQUEST_FILENAME} !-f
  RewriteCond %{REQUEST_FILENAME} !-d
  RewriteRule ^(.*)$ index.php?q=$1 [L,QSA]

E poi gestisci tutte le cose nel tuo script usando il codice php qualcosa del genere

<*>GET["q"]){ $path = split("/",

Fai come Drupal:

  RewriteCond %{REQUEST_FILENAME} !-f
  RewriteCond %{REQUEST_FILENAME} !-d
  RewriteRule ^(.*)$ index.php?q=$1 [L,QSA]

E poi gestisci tutte le cose nel tuo script usando il codice php qualcosa del genere

<*>GET["q"]); for ($i=0; $i+1<count($path); $i++){ $pathmap[$path[$i]] = $path[$i+1]; $i++; } }

Altri suggerimenti

Non so se può essere fatto con una singola espressione, ma può essere fatto con un numero fisso di espressioni, indipendentemente dalla durata della stringa di query.

Le tue regole mod_rewrite verranno chiamate ripetutamente, dandoti quella che a volte viene chiamata ricorsione mod_rewrite. Esistono tecniche per evitarlo, ma penso che tu voglia usarlo.

Imposta una regola che sostituisce l'ultima coppia con name = value & amp;

Continua a virare sulla stringa della query di input sull'output. Ogni volta, la stringa di query si allungherà e il tuo URL si accorcia.

Alla fine hai un solo valore che corrisponde alla tua ultima regola.

Devi catturare la stringa di query con

RewriteCond %{QUERY_STRING} ^(.*)$

E poi lo aggiungi nuovamente all'output con% 1

Si finirebbe con quattro righe.

So che hai iniziato con quattro righe, ma corrisponderesti a tutti i parametri che desideri senza dover aggiungere una quinta riga.

RewriteCond %{QUERY_STRING} ^(.*)$
RewriteRule ^(.*/)([^/]+)/([^/]+) $1?$2=$3&%1 [L]
RewriteCond %{QUERY_STRING} ^(.*)$
RewriteRule ^([^/]+)/ $1.php?%1 [L]

Questo riscriverà quanto segue

/mypage/param1/val1/param2/val2/param3/val3/...     --->
/mypage.php?param1=val1&param2=val2&param3=val3&...

Si interrompe quando rimane solo un parametro. Ci vorrà il primo "parametro" e chiama il file .php con quel nome. Non c'è limite al numero di coppie param / val.

Non credo che il loro sia un modo, ma direi che la soluzione migliore sarebbe avere lo script " index.php " elaborare un percorso invece di dover fare così tanti riferimenti a ritroso.

Quindi, ad esempio, il tuo riscritto sarebbe

RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]

O simile ... Ciò farebbe in modo che la variabile $ _SERVER ['REQUEST_URI'] contenga le informazioni sul percorso, che puoi dividere e analizzare.

$path = split('/', 

Non credo che il loro sia un modo, ma direi che la soluzione migliore sarebbe avere lo script " index.php " elaborare un percorso invece di dover fare così tanti riferimenti a ritroso.

Quindi, ad esempio, il tuo riscritto sarebbe

RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]

O simile ... Ciò farebbe in modo che la variabile $ _SERVER ['REQUEST_URI'] contenga le informazioni sul percorso, che puoi dividere e analizzare.

http://example.com/foo/bar/baz

Questo finisce con $ mode che contiene la modalità e $ path contenente una matrice di elementi che sono il resto del tuo percorso, quindi

<*>

Ti lascerebbe con $ mode come 'foo' e $ path essendo un array contenente 'bar' e 'baz'

SERVER['REQUEST_URI']); array_shift($path); // We always have a first null value $mode = array_shift($path);

Questo finisce con $ mode che contiene la modalità e $ path contenente una matrice di elementi che sono il resto del tuo percorso, quindi

<*>

Ti lascerebbe con $ mode come 'foo' e $ path essendo un array contenente 'bar' e 'baz'

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top