技术解析

关于 nginx 的 rewrite
0
2021-05-26 15:46:49
idczone
写成
server {
listen 80;
server_name *.domain.com;
if ($host ~* (.*)\.domain\.com){
set $sub_name $1;
rewrite ^(.*)$ http://www.domain.com/html/$sub_name.html last;
}
}
可以跳转过去,但是我地址栏的域名不想变动,改成
server {
listen 80;
server_name *.domain.com;
if ($host ~* (.*)\.domain\.com){
set $sub_name $1;
大带宽服务器rewrite ^(.*)$ www.domain.com/html/$sub_name.html last;
}
}
就显示404 找不到,求解,如果我后头跟参数,这个该如何写呢
eg: news.domain.com/xxx.shtml 重写为 www.domain.com/html/news/sss.shtml
谢谢~
恕我愚钝,完全不了解你的意思。。。你的两个配置中除了少了一个http以外没看出任何区别。。。

你说的对,就是一个没有http 然后就报404 ,加上http到是页面打开了,但是地址栏的二级域名也变成了 重写后的 www开始的域名了。我想地址栏不变,打开的是 www... ... 的页面内容。

所以说你要的根本不是rewrite,而是把news指向二级目录。。。

可以这样理解,其实这个是从 webfarm过来的东西,要转成Nginx 我也是晕了

看不懂需求,为什么需求是news.domain.com -> www.domain.com/path ,但又要求 $http_host 不变动?


他的需求就是把news.domain.com指向二级目录。。。这跟Rewrite一点关系都没有。。。

nginx有个原则就是 if 指令基本是废的。强烈建议不要用。
http://wiki.nginx.org/IfIsEvil

rewrite ^(.*)$ /data/htdocs/www.domain.com/html/$sub_name.html last;
rewrite带http://是重定向,地址栏不想变,就是不想重定向,直接rewrite到目录文件

rewrite 是用来跳转的。
既然你不跳转,用 alias 应该就行了。

server_name ~(?[^\.]+)\.domain\.com$;
rewrite ^/(.*)\.shtml$ /html/$category/$1.shtml last;
未测试,也不保证完全贴合你的需求,毕竟你描述得也有问题

你这个server块根本没有定义root,说明不管是什么域名,都是在同一个root。那么你完全没必要把host改写成www.domain.com,还保持原来那个不就可以了。
server {
listen 80;
server_name *.domain.com;
if ($host ~* (.*)\.domain\.com){
set $sub_name $1;
rewrite ^(.*)$ /html/$sub_name.html last;
}
}
// PS. 如果当真要改Host,more_set_input_host "Host: $sub_name.domain.com"可以在rewrite阶段末尾完成,这样content阶段读到的Host就是你想要的了。

跨域的rewrite都一定是返回给浏览器的重定向了。

应该是more_set_input_header,写错了

貌似你需要的proxy

这个是想nginx 替换掉 webfarm

感谢大家的帮助,一开始我想纯nginx替换掉webfarm,但是这个从实践上出现问题,现在着手从物理上拆分替换了 :)

还是没明白你要做什么。同机的话用root或者alias不同机用proxy_pass

感谢关注,这个是纯webfram的规则,然后OK,但是wenfarm会有间歇性不通的问题,所以只能强拆了,本来想省事规则转换,但是发现了问题,现在着手物理解决

数据地带为您的网站提供全球顶级IDC资源
在线咨询
专属客服