web-dev-qa-db-ja.com

REQUEST_URIが見つからない場合にRewriteMapを除外する方法

古いサイトがあります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を使用できません

Apache Ifステートメントが機能しない

3
Donna Delour

私はルックアップが最初に呼び出されたとき、遅延がRewriteMap定義にあるとは思わない。したがって、RewriteMapsは構成の先頭で定義できます。

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_拡張子が続く場合、これをRewriteRuleregexに含めて、できるだけ具体的にします不要なルックアップを防ぎます。例えば:

_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です。

その場合は、RewriteRulepattern^(/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]
_
0
MrWhite