设置nginx中主域名跳到二级目录的问题

moose123 发布于 2016/03/08 16:36
阅读 19K+
收藏 3

比如域名www.a.com

有两个问题请教下:

1、我想当访问该域名时候自动跳到www.a.com/bbs,并且浏览器地址栏还是显示www.a.com,

2、访问www.a.com/bbs的时候,自动显示www.a.com 

请问在nginx中如何配置呢?谢谢

加载中
1
Sel8616
Sel8616

首先,要区分清楚跳转和转发的概念。

第1个问题:可以通过转发实现,其实也可以直接把根目录改到bbs,比如项目根目录原为a

server
{
	listen 80; 
    	listen [::]:80 ipv6only=on default_server; 

	server_name	your_server_name;
	root		/var/www/a/bbs;
	index		index.html;

        ......
}



第2个问题:应该通过rewrite实现重定向

location ^~ /bbs
{
	rewrite /bbs / permanent;
}

0
m
moose123

引用来自“Sel8616”的评论

首先,要区分清楚跳转和转发的概念。

第1个问题:可以通过转发实现,其实也可以直接把根目录改到bbs,比如项目根目录原为a

server
{
	listen 80; 
    	listen [::]:80 ipv6only=on default_server; 

	server_name	your_server_name;
	root		/var/www/a/bbs;
	index		index.html;

        ......
}



第2个问题:应该通过rewrite实现重定向

location ^~ /bbs
{
	rewrite /bbs / permanent;
}

多谢,bbs不是一个目录,所以不能指向这个目录
Sel8616
Sel8616
如果是另一个网站的话,那可能比较麻烦,或许是我没找到方法。反正,我以前配置过一次 /(完全匹配) 到另一个地址,总是不成功。
0
Sel8616
Sel8616

你试试看看

upstream bbs_server
{
	ip_hash;
	server ip:port;
}

location = /
{
	root /xxx/bbs;
	proxy_pass http://bbs_server/;
	proxy_redirect off;
}



0
m
moose123

引用来自“Sel8616”的评论

你试试看看

upstream bbs_server
{
	ip_hash;
	server ip:port;
}

location = /
{
	root /xxx/bbs;
	proxy_pass http://bbs_server/;
	proxy_redirect off;
}



root /xxx/bbs;

我这里没有/xxx或bbs这个目录,只能指定url访问,比如改成

root /bbs;

好像不行

Sel8616
Sel8616
回复 @moose123 : root一行都不要,只管把请求原样转发给上面定义的bbs_server。那个upstream的定义是在server节点之外
m
moose123
回复 @Sel8616 : 不要root那要啥?不能光写个/bbs吧
Sel8616
Sel8616
那直接不要那个root
0
canghailan
canghailan

1.

location =/ {
    rewrite            / /bbs break;
    proxy_pass         http://www.a.com;
}



2.

location =/bbs {
    rewrite            /bbs / redirect;
}



0
Feng_Yu
Feng_Yu
以实际的经验告诉你,这种奇葩的需求无法实现,当年我折腾这种需求近一个月无果。也亏了那一个月潜修,基本吃透了apache的重写算法,从算法中分析出这种需求不可能实现。最后的解决方案是用iframe静态页面,嵌套你要隐藏url的页面,这样的话你所有点击操作在URL看上去将是一个地址
0
m
moose123

引用来自“canghailan”的评论

1.

location =/ {
    rewrite            / /bbs break;
    proxy_pass         http://www.a.com;
}



2.

location =/bbs {
    rewrite            /bbs / redirect;
}



HI,现在是

  location =/{
    # root /bbs;
           rewrite            / /bbs break;
           proxy_pass http://oeserver;
            proxy_redirect  off;
            proxy_set_header   Host             $host;
            proxy_set_header   X-Real-IP        $remote_addr;
            proxy_set_header   X-Forwarded-For  $proxy_add_x_forwarded_for;
            proxy_pass_header Set-Cookie;


            proxy_connect_timeout      60;
            proxy_send_timeout         60;
            proxy_read_timeout         3000;
        }

location =/bbs
{
      rewrite /bbs / redirect;#permanent;
         }

好像有效果了,但是,链接都是/bbs/xxx之类的,貌似都没效果了,都会被定向到首页,这个如何解决呢。谢谢

canghailan
canghailan
回复 @moose123 : http://stackoverflow.com/questions/12463640/nginx-sub-filter-rewrites
canghailan
canghailan
回复 @moose123 : 另外链接里的/bbs是写死的吗,还是动态获取的。动态的还可以在程序上想想办法,项目里有类似的需求,不过开发阶段就考虑到了,所有没有造成太大的困扰。
canghailan
canghailan
回复 @moose123 : 如果不想地址栏里出现/bbs还真有些麻烦,重定向应该可以搞定,但是效果应该很差。之前看nginx资料的时候看到过sub_filter模块,可以替换输出的内容,不过我没有使用过,你可以去查查。
Feng_Yu
Feng_Yu
回复 @moose123 : iframe并不是跳转,而是隐藏了URL(但是可以用firebug或者chrome F12工具这一类的调试工具抓出来)
m
moose123
回复 @Feng_Yu : 你是用iframe跳转?现在跳转到是没问题了。
下一页
0
m
moose123
其实就是链接是/bbs/xx之类的,我希望隐藏这个/bbs,看来不好解决啊,除非把程序改了。
Feng_Yu
Feng_Yu
回复 @moose123 : 如果你想让搜索引擎收录的话,那么要用的是301,而不是302
m
moose123
回复 @Feng_Yu : 恩,明白了,看来的在域名后面拖个尾巴了,如果进入首页www.a.com自动302重定向到www.a.com/bbs 对SEO这些有影响吗?在baidu搜索出来,是显示www.a.com还是www.a.com/bbs呢?
Feng_Yu
Feng_Yu
回复 @moose123 : 二级域名和重写方案即使底层机制是一样的。 如果你页面的URL是写死的,怎么改页面上显示的都是/bbs,那么你用二级域名也没用。懂了吗?
m
moose123
回复 @Feng_Yu : 再问下,如果我改成二级域名bbs.a.com指向www.a.com/bbs 行不?/bbs不是一个目录
Feng_Yu
Feng_Yu
这种需求当年我也遇见过,整整折腾了一个月。 也托这个福,我几乎把apache的rewrite文档从头到尾吃了个透,搞清楚了什么是rewrite,什么是redirect。如何进行各种重写。 悲剧的就是这种需求无法只在web server端实现,需要在应用程序级别做配合。
下一页
OSCHINA
登录后可查看更多优质内容
返回顶部
顶部