![Nginx 重写规则](https://linux22.com/image/688135/Nginx%20%E9%87%8D%E5%86%99%E8%A7%84%E5%88%99.png)
您能帮我弄清楚使用 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;
}