質問

かなり大きな Web サイトを構築していて、.htaccess が少し肥大化していると感じ始めています。現在のシステム (渡される可能性のある変数の数ごとに 1 つのルール) を 1 つのキャッチオールに置き換える方法はありますか?さまざまな入力数を考慮できる式?

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

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 つの式で適切に処理できるようにしたいと考えています。

役に立ちましたか?

解決

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++;
    }
}

他のヒント

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

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 ペアの数に制限はありません。

私はそれらが方法であるとは信じていませんが、最も良い方法は、それほど多くの逆参照を行う代わりに、スクリプト「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' を含む配列のままになります。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top