web-dev-qa-db-ja.com

nginxの場所の書き換え:/ {?x}、{y}、{?z}に一致します。 yを削除

独自のデザインのドッカーコンテナでDrupal 7を使用してCiviCRMを実行しようとしています。

残念ながら、CiviCRMが何らかの理由で不正なリソース要求を出力しているという問題に直面しています。次のような場合もあります(「...」はリソースへの残りのパスを意味します):

/... (good)
/civicrm/... (good)

時々このように:

/civicrm/sitename/... (bad)

時々このように:

/sitename/... (bad)

時々このように:

/civicrm/sitename/civicrm (bad)

時々このように:

/civicrm/sitename/civicrm/sitename/... (very bad)

など、おそらく無限:

/civicrm/sitename/civicrm/sitename/civicrm/... (very bad)

今、正規表現は私の得意ではありません。多くのハミングとハーリングの後、私は以下を作成することができました。

    location /civicrm/sitename {
            rewrite ^/civicrm/sitename/(.*)$ /$1;
    }

    location /sitename/ {
            rewrite ^/sitename/(.*)$ /$1;
    }

現在、多くのリソースの負荷が高くなっていますが、これですべての問題が検出されるわけではありません。私が定義できる最高のものはこれです:

#If the URL contains a / followed by any characters or none followed by a / followed by sitename followed by any characters or none, remove sitename:
rewrite /(?./)sitename/(?.)$ $;
# Then continue processing the next directive.
#If the rewritten URL contains /civicrm/ more than once, remove all instances of /civicrm/ then add it once:
rewrite /(?./)civicrm/civicrm/(?.)$ /civicrm/$;

助けがありますか?

1
DMCoding

URLに/の後に任意の文字が含まれる場合、またはnoneの後に/が続き、sitenameの後に任意の文字が続く場合、またはnoneの場合、sitenameを削除します。

rewrite ^(.+)/sitename(/.*)$ $1$2;

説明:結果を作成するために、一致の前($1)と後($2)のすべてをキャプチャする必要があります。

書き換えられたURLに/ civicrm /が2回以上含まれる場合、/ civicrm /のすべてのインスタンスを削除してから1回追加します。

rewrite "^(.*?)(?:/civicrm){2,}(/.*?)$" $1/civicrm$2;

説明:上記と同じですが、2つ以上の非キャプチャ/civicrm文字列が一致し、最初と最後のキャプチャが遅延していることを除きます。 {を含む式は引用符で囲む必要があります。

正規表現に役立つリソースは here です。

3
Richard Smith