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.

Foi útil?

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&param2=val2&param3=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'

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top