0

HTTPヘッダーに次のようなCookieがあります。

Set-Cookie: frontend=ovsu0p8khivgvp29samlago1q0; adminhtml=6df3s767g199d7mmk49dgni4t7; external_no_cache=1; ZDEDebuggerPresent=php,phtml,php3

フロントエンドの後にある26文字の文字列を抽出する必要があります(例ovsu0p8khivgvp29samlago1q0)。次の正規表現は私にとっての正規表現と一致します。

(?<=frontend=)(.*)(?=;)

ただし、Varnish Cacheを使用しており、正規表現の置換のみを使用できます。したがって、そのCookie値(26文字のfrontend文字列)を抽出するには、そのパターンに一致しないすべての文字を一致させる必要があります(したがって、それらをに置き換えることができます'')。

私はかなりのグーグルをしましたが、これまでのところ空白を描いています。私は以下を試しました

  • 必要なパターンに一致しない文字に一致します。[^((?<=frontend=)[A-Za-z0-9]{26}(?=;))]これは、保持したい文字を含むランダムな文字に一致します。

誰かが私を正しい方向に向けたり、どこが間違っていたのかをメモしてくれたらありがたいです。

4

3 に答える 3

2

バックエンドは同じ名前の複数のヘッダーを送信する傾向があるため、Set-Cookie応答ヘッダーはVarnishでは少し不思議です。これはRFCで禁止されていますが、事実上の方法です。

Varnish 3.0を使用している場合は、ヘッダーVMODを使用できます。これにより、応答が解析され、必要なものが抽出されます。

https://github.com/varnish/libvmod-header

于 2012-11-25T20:48:35.980 に答える
1

正規表現パターンを使用する

^Set-Cookie:.*?\bfrontend=([^;]*)

「フロントエンドの後に続く26文字の文字列」はグループになります1(通常、置換文字列では$1

于 2012-11-24T01:09:59.923 に答える
1

置換ストリングを制御できますか?もしそうなら、Ωmegaの答えを使用$1して、置換文字列でfrontend値を書き戻すことができます。

それ以外の場合は、これを使用できます。

^Set-Cookie:.*(?!frontend=)|(?<=frontend=.{26}).*$

これは、文字列の先頭から検出されるまでのすべてに一致しますfrontend=frontend=または、文字列の最後まで、左側に正確に26文字あるすべてのものと一致します。これらの26文字が可変長の場合、.NETのみが可変長後読みをサポートするため、非常に複雑になります。

最後の質問です。あなたの正規表現を見てみましょう:

[^((?<=frontend=)[A-Za-z0-9]{26}(?=;))]

さて、最初に[^...]あなたがあなたのパターンを取り囲もうとしたネガティブなキャラクタークラスは、実際にはこのようには機能しません。それはまだキャラクタークラスなので、そのクラス内にない単一のキャラクターにのみ一致します。しかし、それはさらに複雑になります(そして、なぜそれがまったく一致するのか疑問に思います)。したがって、最初に文字クラスを最初 ので閉じる必要があります]。この文字クラスは、、、、、、、文字または数字以外のものと(一致します。次に、がそれに適用されるので、それらの文字のうち26個を見つけようとしています。次に、これらの26文字の後に。が続くことを表明します。今、うまくいかないものがやってくる。クロージングは​​実際にスローしてエラーになるはずです。そして最後の?<=){26}(?=;);)]リテラルとして解釈されるだけ]です。

文字クラスのネストを可能にするいくつかの正規表現フレーバーがあります(Javaはそうします)。この場合、単純に。と同等の文字クラスがあり[^a-zA-Z0-9(){}?<=;]ます。しかし、私がグーグルで検索できる限り、VarnishはPCREを使用しており、PCREでは正規表現をコンパイルしないでください。

于 2012-11-24T01:13:15.343 に答える