Nginx 重写规则

Nginx 重写规则

您能帮我弄清楚使用 Nginx 的以下重定向吗?

当用户输入http(s)://(www.)domainA.com/view.php他/她将能够访问此 view.php 文件(位于 Web 根目录中)

所有其他访问 http(s)://(www.)domainA.com 的请求都应重定向至https://learn.domainB.com

(基本上只有这个 view.php 文件才不会发生重定向)

我当前的 Nginx vhost 文件:

server {

    listen 80;
    server_name domainA.com www.domainA.com;

    root /var/www/public_html;

    if ($request_uri !~* (/view.php) ) {
       rewrite ^ https://learn.domainB.com permanent;
    }
    location /view\.php {
       fastcgi_pass 127.0.0.1:9000;
       fastcgi_index view.php;
       fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
       include fastcgi_params;
    }
}

非常感谢您的意见。谢谢!

答案1

我更喜欢这种配置:

server {

    listen 80;
    server_name domainA.com www.domainA.com;

    root /var/www/public_html;

    location = /view.php {
        fastcgi_pass 127.0.0.1:9000;
        fastcgi_index view.php;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        include fastcgi_params;
    }

    location / {
       return 301 https://learn.domainB.com;
    }
}

不需要if语句,因为 nginx 从开始到结束处理位置顺序,并使用第一个匹配的位置块。

这对解决下载问题没有帮助view.php,正如 Anubioz 提到的那样,文件上的某些内容阻止它执行。

我还删除了部分中的点的转义location = /view.php,因为这不是正则表达式匹配,因此转义不是必需的。

答案2

你的配置应该可以正常工作,不过我会用 301 重定向替换重写:

if ($request_uri !~* (^/view.php$) ) {
    return 301 https://learn.domainB.com;
}

如果您需要传递任何参数view.php(如view.php?a=b),那么您的配置应该如下所示:

if ($request_uri !~* (^/view.php(\?.*)?$) ) {
    return 301 https://learn.domainB.com;
}

相关内容