Comment traduire des majuscules en minuscules dans une règle de réécriture dans Nginx web server?

j'ai besoin de traduire l'adresse:

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

21
demandé sur ErikE 2010-09-08 12:46:59

7 réponses

Oui, vous allez avoir besoin de perl. Si vous utilisez Ubuntu, au lieu d'apt-get install nginx-full, utilisez apt-get install nginx-extras, qui aura le module perl intégré. Puis, dans votre fichier de configuration:

  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;
      }
    ...
13
répondu Thiago Ganzarolli 2012-06-23 15:46:23

j'ai réussi à réaliser l'objectif à l'aide d'embedded perl:

location ~ [A-Z] {
  perl 'sub { my $r = shift; $r->internal_redirect(lc($r->uri)); }';
}
7
répondu Dennis Krupenik 2011-06-16 10:55:32
location ~*^/test/ {
  return 301 http://www.example.com/test;
}

Un emplacement peut être défini par un préfixe, ou par une expression régulière. Les expressions régulières sont spécifiées avec le"~*" modificateur (pour l'appariement non sensible à la casse), ou le modificateur " ~ " (pour l'appariement sensible à la casse).

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

4
répondu Adrian Hernandez-Lopez 2014-11-28 11:27:08
location /dupa/ {
    set_by_lua $request_uri_low "return ngx.arg[1]:lower()" $request_uri;
    rewrite ^ https://$host$request_uri_low;
}
4
répondu Adam Dobrawy 2015-06-01 21:06:48

basé sur la réponse D'Adam, j'ai fini par utiliser lua, car il est disponible sur mon serveur.

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;
}
0
répondu Timon de Groot 2018-01-02 11:59:47

cette chose ne peut être faite qu'en utilisant la perl embeddée.

-2
répondu CyberDem0n 2010-12-02 11:40:55
RewriteEngine On
RewriteMap  lc int:tolower
RewriteCond %{REQUEST_URI} [A-Z]
RewriteRule (.*) ${lc:} [R=301,L]
-18
répondu Anonymous coward 2012-02-09 09:57:41