古いサイトがありますwordpress現在移行中のサイトです。
リダイレクトする必要のあるURLは約50000個あります。
このために、正常に動作しているように見えるDBMファイルを使用していますが、負荷テスト中に、各要求で約0.5秒が失われていることに気付きました。
ログを確認すると、50000のDBMファイルが毎回ヒットしているようです。
DBMを50000から10000に変更したところ、50000DBMファイルからの各要求で約.25秒が得られたことがわかりました。
私はこのようなことをできるようにしたいのですが、コードをどのように混合して一致させても、機能させることはできません。
<If "%{REQUEST_URI} =~ m#^abc#">
RewriteMap abcredirects "dbm:/etc/httpd/conf/dbm/abcredirects.dbm"
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond ${abcredirects:$1} !=""
RewriteRule ^(.*) /${abcredirects:$1} [R=301,L]
</IfModule>
</If>
<If "%{REQUEST_URI} =~ m#^xyz#">
RewriteMap xyzredirects "dbm:/etc/httpd/conf/dbm/xyzredirects.dbm"
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond ${xyzredirects:$1} !=""
RewriteRule ^(.*) /${xyzredirects:$1} [R=301,L]
</IfModule>
</If>
上記をSudoコードとして使用するこれを機能させるにはどうすればよいですか?
すなわち。
URLの場合example.com/abc12345.htm
覗く abcredirects.dbm
それ以外の場合はVirtualHostに戻る
URL example.com/xyz12345.htm
覗く xyzredirects.dbm
elseExitでVirtualHostに移動します
URL example.com/abc12345.htm
調べないでくださいxyzredirects.dbm
URL example.com/xyz12345.htm
調べないでくださいabcredirects.dbm
URLの場合example.com/hik12345.htm
調べないでくださいxyzredirects.dbm
またはabcredirects.dbm
いいえ.htaccess残念ながら私は.htaccessを使用できません
私はルックアップが最初に呼び出されたとき、遅延がRewriteMap
定義にあるとは思わない。したがって、RewriteMap
sは構成の先頭で定義できます。
RewriteRule
パターンでURLパスを確認できる(そして確認する必要がある)ため、_<If>
_条件を使用する必要はないようです。 )。
VHostで次のようなものを試してください。
_RewriteEngine On
RewriteMap abcredirects "dbm:/etc/httpd/conf/dbm/abcredirects.dbm"
RewriteMap xyzredirects "dbm:/etc/httpd/conf/dbm/xyzredirects.dbm"
RewriteCond ${abcredirects:$1} !=""
RewriteRule ^(/abc.*) /${abcredirects:$1} [R=301,L]
RewriteCond ${xyzredirects:$1} !=""
RewriteRule ^(/xyz.*) /${xyzredirects:$1} [R=301,L]
_
_<IfModule>
_コンテナは必要ありません(サイトがmod_rewriteなしで動作するように意図されている場合を除きますが、おそらくそうではありません)。
RewriteRule
パターンが最初に処理されます。それが失敗した場合、前の条件(リライトマップを検索する)はスキップされ、処理は次のRewriteRule
に進みます。
_/abc12345.htm
_が文字どおり数字で構成され、その後に_.htm
_拡張子が続く場合、これをRewriteRule
regexに含めて、できるだけ具体的にします不要なルックアップを防ぎます。例えば:
_RewriteRule ^(/xyz\d+\.htm)$ /${xyzredirects:$1} [R=301,L]
_
テストする前に、ブラウザのキャッシュがクリアされていることを確認してください。このため、302(一時)リダイレクトを使用してテストする方が簡単な場合がよくあります。
ただし、これがすべて新しいWebサイト/サーバーで発生している場合、上記は、新しいページや静的リソースに対するすべての要求を含むすべての要求に影響を与えるため、おそらく最善のアプローチではありません。
このように多くのURLがある場合、サイトが404であると既に判断したときにリダイレクトをスクリプト化することが望ましい場合がよくあります。リクエストのこの後期段階でのみ、サイトのデータベースで新しいURLを検索し、リダイレクトをトリガーする必要があります。このように、「通常の」サイトのパフォーマンスに影響を与えることはありません。
更新:
abcのURLは、_
example.com/dir/dir/abc12345.htm
_または_example.com/abc12345.htm
_または_example.com/dir/dir/abc12345.xml
_、_example.com/dir/abc12345.xml
_の2つの異なる方法である可能性があります。 URLの唯一の定数はabc
です。
その場合は、RewriteRule
patternを^(/abc.*)
から次のように変更します。
_RewriteRule (.*/abc.+\.(?:htm|xml))$ /${abcredirects:$1} [R=301,L]
_
上記のように、ファイルのベース名の残りの部分(ファイル拡張子の前)が常に数字(0〜9)で構成されている場合は、より具体的に、_\d
_ではなく_.
_と一致させます。または、(例のように)常に5桁の場合は、_\d{5}
_。
上記は一致するURLパス全体をキャプチャし(例:_/dir/dir/abc12345.htm
_)、これが引数としてリライトマップに渡されることに注意してください。
_RewriteRule (.*/abc\d+\.(?:htm|xml))$ /${abcredirects:$1} [R=301,L]
_