关于 nginx 的 rewrite

2014-11-06 19:12:31 +08:00
 moto72
写成
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
谢谢~
3186 次点击
所在节点    NGINX
18 条回复
wzxjohn
2014-11-06 19:17:37 +08:00
恕我愚钝,完全不了解你的意思。。。你的两个配置中除了少了一个http以外没看出任何区别。。。
moto72
2014-11-06 19:20:43 +08:00
@wzxjohn 你说的对,就是一个没有http 然后就报404 ,加上http到是页面打开了,但是地址栏的二级域名也变成了 重写后的 www开始的域名了。我想地址栏不变,打开的是 www... ... 的页面内容。
wzxjohn
2014-11-06 19:50:01 +08:00
@moto72 所以说你要的根本不是rewrite,而是把news指向二级目录。。。
moto72
2014-11-06 19:52:22 +08:00
@wzxjohn 可以这样理解,其实这个是从 webfarm过来的东西,要转成Nginx 我也是晕了
Havee
2014-11-06 20:04:52 +08:00
看不懂需求,为什么需求是news.domain.com -> www.domain.com/path ,但又要求 $http_host 不变动?
wzxjohn
2014-11-06 20:06:59 +08:00
@moto72
@Havee 他的需求就是把news.domain.com指向二级目录。。。这跟Rewrite一点关系都没有。。。
est
2014-11-06 20:30:49 +08:00
nginx有个原则就是 if 指令基本是废的。强烈建议不要用。

http://wiki.nginx.org/IfIsEvil
freetg
2014-11-06 21:05:41 +08:00
rewrite ^(.*)$ /data/htdocs/www.domain.com/html/$sub_name.html last;

rewrite带http://是重定向,地址栏不想变,就是不想重定向,直接rewrite到目录文件
msg7086
2014-11-07 01:27:30 +08:00
rewrite 是用来跳转的。
既然你不跳转,用 alias 应该就行了。
ericFork
2014-11-07 02:50:52 +08:00
server_name ~(?<category>[^\.]+)\.domain\.com$;

rewrite ^/(.*)\.shtml$ /html/$category/$1.shtml last;

未测试,也不保证完全贴合你的需求,毕竟你描述得也有问题
lnkisi
2014-11-07 08:28:36 +08:00
你这个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就是你想要的了。
lnkisi
2014-11-07 08:29:59 +08:00
跨域的rewrite都一定是返回给浏览器的重定向了。
lnkisi
2014-11-07 08:31:48 +08:00
@lnkisi 应该是more_set_input_header,写错了
sujin190
2014-11-07 09:26:49 +08:00
貌似你需要的proxy
moto72
2014-11-07 09:48:29 +08:00
@Havee 这个是想nginx 替换掉 webfarm
moto72
2014-11-07 09:50:06 +08:00
感谢大家的帮助,一开始我想纯nginx替换掉webfarm,但是这个从实践上出现问题,现在着手从物理上拆分替换了 :)
msg7086
2014-11-07 09:56:19 +08:00
还是没明白你要做什么。同机的话用root或者alias不同机用proxy_pass
moto72
2014-11-07 10:12:53 +08:00
@msg7086 感谢关注,这个是纯webfram的规则,然后OK,但是wenfarm会有间歇性不通的问题,所以只能强拆了,本来想省事规则转换,但是发现了问题,现在着手物理解决

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/144483

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX