2017-09-12 5 views
2

私は静的なニュースのようなページを提供するためにnginxを使用しています。 トップレベルには、記事の概要を示す https://example.com/en/news/があります。 個々のアイテムのURLは、https://example.com/en/news/some-articleリクエストURIに特定の単語が含まれていないと、nginxでリダイレクトする方法

です。すべてのURLには、/en/または/de/のような言語が含まれています。 の言語が正しいURLに含まれていないというリクエストをリダイレクトするルールを作成したいとします(この言語は$langで利用可能なIPに基づいてマップされています)。

次は(en例)動作するはずです:

/news/    --- redirect ---> /en/news/ 
/news/some-article --- redirect ---> /en/news/some-article 

私の試みは、これまでのところ、これは無限リダイレクトが生じ、この

location ~* /news/.*$ { 
    if ($request_uri !~* /(de|en)/$) { 
     return 302 https://example.com/$lang/$request_uri; 
    } 
} 

のようなものが見えました。

+1

[nginx URL regexを使った負の正規表現?](https://stackoverflow.com/questions/16159108/nginx-url-rewrite-using-negative-regex) – ctwheels

答えて

1

あなたの解決策は私にはあまりにも複雑に思えます。また、末尾が$$request_uriをテストすると、書き換えられたURI(したがってループ)と一致することはありません。

接頭辞locationを使用して、/news/で始まるURIのみを一致させることができます。

これはあなたのために働くことがあり、あなたが他の場所で$langの値を計算していると仮定すると:あなたが競合する可能性があり、コンフィギュレーション内の正規表現locationブロックを持っている場合

location ^~ /news/ { 
    return 302 /$lang$request_uri; 
} 

^~修飾子が必要なだけです。詳細については、this documentを参照してください。

+0

ありがとう、私が思う "if"を避けることすらできます。 – alexhanschke

関連する問題