nginx 返回 301 / 重定向

nginx 返回 301 / 重定向

在所有“nginx 中的重定向”问题中,我找不到如何使用正则表达式进行重定向(使用 return 301 并且最好没有 if)。

我有一个到我的网站的链接,我想删除最后的参数:

domain.com/article/some-sluggish-link/?report=1        #number at end

用正则表达式来找到这个:

\?report=\d*$

为此我想 301 重定向到:

domain.com/article/some-sluggish-link/

我在 nginx.conf 中有 3 个重定向:

server {        
    listen 80;      
    server_name subdomain.example.com.; #just one subdomain 
    }

server {
    listen 80;
    server_name  *.example.com;         
    return 301 http://example.com$request_uri;
    }

server {
    listen 80;
    server_name  example.com;
    }

并且它起作用了;它将所有 www.、ww.、aaa. 和所有子域名(除 1 个特定子域名外)重定向到主域名.com

我将非常感激任何帮助,干杯!

编辑2015/03/25

我的配置文件中已经有“location /”:

location / {  
    uwsgi_pass unix://opt/run/ps2.sock;  
    include uwsgi_params;  
    }

它会重定向到某个 Django 应用。应用“if”子句后,它会出现无限循环!

我的问题基本上与 SEO 有关,这意味着谷歌索引某些页面(带有“?report =”参数的页面),这些页面是没有此尾随参数的 URL 的副本。

我想让 googlebot 使用 robots.txt 停止索引,但问题是您不能在此文件中使用正则表达式。另外,我无法说清楚哪个 url 需要重定向或停止索引,因为它会以某种方式随机发生...

答案1

我自己还没有尝试过,但应该可以。在 server {} 块中添加以下内容:

location / {
    if ($args !~ ^$) {
        rewrite ^ $request_uri? permanent;
    }
}

这个块实际上做了什么:

location /告诉 nginx 将这些指令应用于所有匹配根目录和子目录的请求。

if ($args !~ ^$)使用正则表达式检查 URI 是否包含任何查询参数。

rewrite ^ $request_uri? permanent;重定向到所需 URI,无需任何查询参数。?$request_uri 末尾的 告诉 nginx 从重定向 URL 中删除查询参数。

相关内容