apache mod_rewrite uma regra para qualquer número de possibilidades
-
02-07-2019 - |
Pergunta
Estou construindo uma bastante grande website e meu .htaccess está começando a sentir um pouco inchado, há uma maneira de substituir o meu sistema atual de - uma regra para cada do número possibile de vars que poderia ser passada, a um prendedor toda a expressão que pode ser responsável por um número variável de entradas?
Por exemplo eu tenho atualmente:
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
a primeira referência anterior é sempre o Modo e (se mais existir algum) a segunda é sempre id , seguidamente quaisquer outras referências anteriores alternados entre o nome da entrada e da sua valor
http://www.example.com/search
http://www.example.com/search/3039/sort_by/name_asc/page/23
Eu adoraria ser capaz de ter uma expressão para graciosamente lidar com todas as entradas.
Solução
Do como Drupal:
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php?q=$1 [L,QSA]
E, em seguida, lidar com todas as coisas em seu script usando o código php algo como isto
$pathmap = ();
if ($_GET["q"]){
$path = split("/", $_GET["q"]);
for ($i=0; $i+1<count($path); $i++){
$pathmap[$path[$i]] = $path[$i+1];
$i++;
}
}
Outras dicas
Eu não sei se isso pode ser feito com uma única expressão, mas isso pode ser feito com um número fixo de expressões, não importa quanto tempo a string de consulta.
As suas regras mod_rewrite será chamado várias vezes, dando-lhe o que é às vezes chamado recursão mod_rewrite. Existem técnicas para evitá-lo, mas eu acho que você quiser usá-lo.
Configurar uma regra que substitui o último par com name = value &
Mantenha aderência na cadeia de consulta de entrada para a saída. Toda vez através, a cadeia de consulta terá mais tempo e seu URL vai ficar mais curto.
Finalmente, você tem apenas um único valor que corresponde à sua última regra.
Você tem que capturar a string de consulta com
RewriteCond %{QUERY_STRING} ^(.*)$
E então você adicioná-lo de volta para a saída com% 1
Você iria acabar com quatro linhas.
Eu sei que quatro linhas é o que você começou com, mas você deseja corresponder quantos parâmetros você quer sem ter que adicionar uma quinta linha.
RewriteCond %{QUERY_STRING} ^(.*)$
RewriteRule ^(.*/)([^/]+)/([^/]+) $1?$2=$3&%1 [L]
RewriteCond %{QUERY_STRING} ^(.*)$
RewriteRule ^([^/]+)/ $1.php?%1 [L]
Isto irá reescrever o seguinte
/mypage/param1/val1/param2/val2/param3/val3/... --->
/mypage.php?param1=val1¶m2=val2¶m3=val3&...
Ela pára quando há apenas um parâmetro restante. Levará o primeiro "parâmetro" e chamar o arquivo .php com esse nome. Não há limite para o número de param / val pares.
Eu não acredito que a sua é uma maneira -. Mas eu diria que sua melhor aposta seria a de ter o script "index.php" processar um caminho em vez de ter que fazer tantas referências anteriores
Assim, por exemplo, o seu RewriteRule seria
RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
ou similar ... Este seria, então fazer a $ _SERVER [ 'REQUEST_URI'] variável contêm as informações do caminho, o que você pode dividir e análise.
$path = split('/', $_SERVER['REQUEST_URI']);
array_shift($path); // We always have a first null value
$mode = array_shift($path);
Isso acaba com $ modo contendo o modo, e US $ caminho que contém um conjunto de elementos que são o resto do seu caminho, assim
http://example.com/foo/bar/baz
iria deixá-lo com US $ modo de ser 'foo' e $ caminho sendo um array contendo 'bar' e 'baz'