12

かなり大きな Web サイトを構築していて、.htaccess が少し肥大化したように感じ始めています。現在のシステムを置き換える方法はありますか?さまざまな数の入力を説明できる式?

たとえば、私は現在持っています:

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

最初の後方参照は常にモードであり、(それ以上存在する場合) 2 番目は常にidです。それ以降の後方参照は、入力の名前とその値の間で交互に行われます。

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

1 つの式ですべての入力を適切に処理できるようにしたいと考えています。

4

3 に答える 3

9

Drupalが好きですか:

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

そして、次のようなphpコードを使用して、スクリプト内のすべてのものを処理します

$pathmap = ();
if ($_GET["q"]){
    $path = split("/", $_GET["q"]);
    for ($i=0; $i+1<count($path); $i++){
        $pathmap[$path[$i]] = $path[$i+1];
        $i++;
    }
}
于 2008-09-22T22:17:16.097 に答える
8

単一の式で実行できるかどうかはわかりませんが、クエリ文字列の長さに関係なく、一定数の式で実行できます。

mod_rewrite ルールは繰り返し呼び出され、mod_rewrite 再帰と呼ばれることもあります。回避するテクニックはありますが、使いたいと思います。

最後のペアを name=value& に置き換えるルールを設定します

入力クエリ文字列を出力に追加し続けます。毎回、クエリ文字列が長くなり、URL が短くなります。

最終的に、最後のルールに一致する値は 1 つだけになります。

クエリ文字列をキャプチャする必要があります

RewriteCond %{QUERY_STRING} ^(.*)$

そして、それを %1 で出力に追加し直します

最終的には 4 行になります。

最初は 4 行だったと思いますが、5 行目を追加しなくても、必要な数のパラメーターを一致させることができます。

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

これにより、次のように書き換えられます

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

残りのパラメータが 1 つになると停止します。最初の「パラメータ」を取り、その名前で .php ファイルを呼び出します。param/val ペアの数に制限はありません。

于 2008-09-23T05:48:14.517 に答える
2

それらが方法だとは思いませんが、多くのバックリファレンスを実行するのではなく、スクリプト「index.php」にパスを処理させるのが最善の策だと思います。

たとえば、あなたのリダイレクトは次のようになります

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

または同様の...これにより、$ _ SERVER ['REQUEST_URI']変数にパス情報が含まれ、分割および解析できます。

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

これは、モードを含む$ modeと、パスの残りの部分である要素の配列を含む$pathになります。

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

$modeは'foo'であり、$pathは'bar'と'baz'を含む配列です。

于 2008-09-22T22:20:15.137 に答える