apache rewriterule with rewritemap
-
19-09-2019 - |
質問
私は持っています RewriteMap
それは次のように見えます:
Guide 1
Mini-Guide 2
White Paper 3
そして、私はそれを含めています Apache
経由
RewriteMap legacy txt:/var/www/site/var/rewrite_map.txt
作成したい RewriteRule
これにより、上記の左側からの値のみが許可されます RewriteMap
この位置にいること。
RewriteRule ^/section/downloads/(${legacy})/(.*)$ /blah.php?subsection=${legacy:%1}&title=$2
私は使えることを知っています ${legacy}
右側では、左側に使用できますか?
解決
マップファイルでは、左側がキーであり、右側は値です。マップと一致するルールを作成すると、キーを入力すると値が出力されます。
あなたの書き直しをこれに変更してください:
# Put these on one line
RewriteRule ^/section/downloads/([a-zA-Z-]+)/(.*)$
/blah.php?subsection=${legacy:$1}&title=$2
最初のグループは、着信URLの文字列をキャプチャします。交換用の$ 1は、名前付きマップに適用されます。デフォルト値を作成するには、変更します ${legacy:$1}
に ${legacy:$1|Unknown}
.
最後に、マップファイルにある値でルールのみを動作させたい場合は、 RewriteCond
:
RewriteCond ${legacy:$1|Unknown} !Unknown
# Put these on one line
RewriteRule ^/section/downloads/([a-zA-Z-]+)/(.*)$
/blah.php?subsection=${legacy:$1}&title=$2
条件は、マップがデフォルト値を返さない場合(Unknown
)、次のルールを実行します。それ以外の場合は、ルールをスキップして先に進みます。
他のヒント
別のバリアント:
# %1 will be the subpattern number1 afterwards
RewriteCond %{REQUEST_URI} ^/section/downloads/(.*)
# check if there is no mapping for %1
RewriteCond ${legacy:%1} !^$
# if there is rewrite it
RewriteRule ^/(.*) /blah.php?subsection=${legacy:%1}&title=$2 [R]
あなたは言った、あなたはマップにある値のみを許可したいと思っています。これは、キャプチャグループの正規表現の追加制限を指定しない限り不可能です。マップ自体でそれを行う方法はありません。私の知る限り、左側のパターンに適用できる「map.keys」構文はありません。
しかし、
キャプチャされた値が見つからない場合は、デフォルト値を指定できます。こちらです:
## all on one line
RewriteRule ^/section/downloads/([a-zA-Z-]+)/(.*)$
/blah.php?subsection=${legacy:$1|defaultValue}&title=$2
「DefaultValue」を好きなものに置き換えます。たとえば、0(ゼロ)、または「ゼロ」、または「ゼロ」、与えられたargがマップで見つからない場合。
その後、その結果を別のルールで書き換えるか、それが流れるようにして、デフォルトの値でURLで「404」メッセージを提供するだけです。
別のルールを使用することを選択した場合、次のようになります。
## all on one line
RewriteRule ^/section/downloads/([a-zA-Z-]+)/(.*)$
/blah.php?subsection=${legacy:$1|notFoundMarker}&title=$2
## This rule fires if the lookupKey was not found in the map in the prior rule.
RewriteRule ^/blah.php?subsection=notFoundMarker /404.php [L]