我需要翻译地址:
www.example.com/TEST in ---> www.example.com/test
答案 0 :(得分:14)
是的,你需要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;
}
...
答案 1 :(得分:7)
我设法使用嵌入式perl实现目标:
location ~ [A-Z] {
perl 'sub { my $r = shift; $r->internal_redirect(lc($r->uri)); }';
}
答案 2 :(得分:4)
location ~*^/test/ {
return 301 http://www.example.com/test;
}
位置可以由前缀字符串或正则表达式定义。正则表达式使用前面的“〜*”修饰符(用于不区分大小写的匹配)或“〜”修饰符(用于区分大小写的匹配)指定。
Soruce:http://nginx.org/en/docs/http/ngx_http_core_module.html#location
答案 3 :(得分:4)
location /dupa/ {
set_by_lua $request_uri_low "return ngx.arg[1]:lower()" $request_uri;
rewrite ^ https://$host$request_uri_low;
}
答案 4 :(得分:1)
根据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;
}
答案 5 :(得分:0)
我想指出,大多数 Perl 答案都容易受到 CRLF 注入的影响。
你不应该在 HTTP 重定向中使用 nginx 的 $uri 变量。 $uri 变量受规范化 (more info),包括:
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;
}';