如何在nginx web服务器中将重写规则中的大写字母转换为小写字母?

如何在nginx web服务器中将重写规则中的大写字母转换为小写字母?,nginx,rewrite,uppercase,lowercase,Nginx,Rewrite,Uppercase,Lowercase,我需要翻译地址: www.example.com/TEST in--->www.example.com/TEST我使用嵌入式perl实现了这个目标: location ~ [A-Z] { perl 'sub { my $r = shift; $r->internal_redirect(lc($r->uri)); }'; } 是的,您将需要perl。如果您使用的是Ubuntu,而不是apt get install nginx full,请使用apt get install ngi

我需要翻译地址:


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

我使用嵌入式perl实现了这个目标:

location ~ [A-Z] {
  perl 'sub { my $r = shift; $r->internal_redirect(lc($r->uri)); }';
}

是的,您将需要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;
      }
    ...
位置可以由前缀字符串或正则表达式定义。正则表达式是用前面的“~*”修饰符指定的(不区分大小写的匹配),或“~”修饰符指定的(区分大小写的匹配)


Soruce:

根据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;
}

虽然我的查询参数被剥离了,但效果很好。这对我来说很有效。在ubuntu上,我需要
安装nginx extras
。以及我放在特定nginx conf文件中的
location~[A-Z]{…
代码(对于具有多个站点的服务器)也为实际使用这些代码的人提供了一个要点。这基本上是相同的代码,但我在上面的评论中解释的方式-更友好一点-这太棒了,我正在寻找其他东西,这非常适合。先生,你太好了!小心这个答案。如果是邪恶的:@MacroMan只有在<代码中使用才可能是不安全的>位置context,并取决于此配置片段后面的内容。对于大多数情况,此配置片段应该是完全安全的。它可以解决发布的问题,但“忽略大小写”和“降低大小写”是两个完全不同的东西。如果您不想在地址字段中重写地址并回答带有任何大小写的true page,则此方法是兼容的。这里讨论了解决此问题的其他方法。您可能希望使用301而不是302进行SEO,例如:
rewrite^https://$host$request\u uri\u low permanent;
…和
return
:<代码>返回301$request\u url\u low。
location /dupa/ {
    set_by_lua $request_uri_low "return ngx.arg[1]:lower()" $request_uri;
    rewrite ^ https://$host$request_uri_low;
}
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;
}