30

我需要翻译地址:

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

4

6 回答 6

19

是的,您将需要 perl。如果您使用的是 Ubuntu,而不是 apt-get install nginx-full,请使用 apt-get install nginx-extras,它将具有嵌入式 perl 模块。然后,在您的配置文件中:

  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;
      }
    ...
于 2012-06-23T15:46:23.010 回答
10
location /dupa/ {
    set_by_lua $request_uri_low "return ngx.arg[1]:lower()" $request_uri;
    rewrite ^ https://$host$request_uri_low;
}
于 2015-06-01T21:06:48.423 回答
9

我设法使用嵌入式 perl 实现了目标:

location ~ [A-Z] {
  perl 'sub { my $r = shift; $r->internal_redirect(lc($r->uri)); }';
}
于 2011-06-16T10:55:32.383 回答
3
location ~*^/test/ {
  return 301 http://www.example.com/test;
}

位置可以由前缀字符串或正则表达式定义。正则表达式使用前面的“~*”修饰符(用于不区分大小写的匹配)或“~”修饰符(用于区分大小写的匹配)指定。

来源:http : //nginx.org/en/docs/http/ngx_http_core_module.html#location

于 2014-11-28T11:27:08.087 回答
3

根据亚当的回答,我最终使用了 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;
}
于 2018-01-02T11:59:47.777 回答
0

我想指出,大多数 Perl 答案都容易受到 CRLF 注入的影响。

你不应该在 HTTP 重定向中使用 nginx 的 $uri 变量。$uri 变量需要进行规范化(更多信息),包括:

  • URL 编码的字符被解码
  • 删除 ? 和查询字符串
  • 连续的 / 字符被单个 / 替换

URL解码是CRLF注入漏洞的原因。如果您在重定向中使用 $uri 变量,则以下示例 url 将在您的重定向中添加恶意标头。

https://example.org/%0ASet-Cookie:MaliciousHeader:Injected

%0A 被解码为 \n\r 并且 nginx 将在标题中添加以下行:

Location: https://example.org
set-cookie: maliciousheader:injected

安全的 Perl 重定向需要替换所有换行符。

perl_set $uri_lowercase 'sub {
    my $r = shift;
    my $uri = $r->uri;
    $uri =~ s/\R//; # replace all newline characters
    $uri = lc($uri);
    return $uri;
}';
于 2021-06-20T09:34:35.057 回答