web-dev-qa-db-ja.com

nginx Webサーバーの書き換えルールで大文字を小文字に変換するにはどうすればよいですか?

住所を翻訳する必要があります:

www.example.com/TEST in ---> www.example.com/test

25
Peak

はい、Perlが必要になります。 Ubuntuを使用している場合は、apt-get install nginx-fullの代わりに、組み込みのPerlモジュールを含むapt-get installnginx-extrasを使用してください。次に、構成ファイルで次のようにします。

  http {
  ...
    # Include the Perl module
    Perl_modules Perl/lib;
    ...
    # Define this function
    Perl_set $uri_lowercase 'sub {
      my $r = shift;
      my $uri = $r->uri;
      $uri = lc($uri);
      return $uri;
    }';
    ...
    server {
    ...
      # As your first location entry, tell nginx to rewrite your uri,
      # if the path contains uppercase characters
      location ~ [A-Z] {
        rewrite ^(.*)$ $scheme://$Host$uri_lowercase;
      }
    ...
16

私は埋め込まれたPerlを使用して目標を達成することができました:

location ~ [A-Z] {
  Perl 'sub { my $r = shift; $r->internal_redirect(lc($r->uri)); }';
}
8
Dennis Krupenik
location /dupa/ {
    set_by_lua $request_uri_low "return ngx.arg[1]:lower()" $request_uri;
    rewrite ^ https://$Host$request_uri_low;
}
5
Adam Dobrawy
location ~*^/test/ {
  return 301 http://www.example.com/test;
}

場所は、プレフィックス文字列または正規表現のいずれかで定義できます。正規表現は、前の「〜*」修飾子(大文字と小文字を区別しないマッチングの場合)または「〜」修飾子(大文字と小文字を区別するマッチングの場合)で指定されます)。

ソース: http://nginx.org/en/docs/http/ngx_http_core_module.html#location

Adamの回答に基づいて、サーバーで利用できるluaを使用することになりました。

set_by_lua $request_uri_low "return ngx.arg[1]:lower()" $request_uri;
if ($request_uri_low != $request_uri) {
   set $redirect_to_lower 1;
}
if (!-f $request_uri) {
    set $redirect_to_lower "${redirect_to_lower}1";
}
if ($redirect_to_lower = 11) {
    rewrite . https://$Host$request_uri_low permanent;
}
2
Timon de Groot