将子域上的已知文件夹重定向到nginx的主站点

时间:2012-08-31 09:41:13

标签: url-rewriting nginx

我的CMS中有几个基于子域的网站,如:

a.site.com
b.site.com

所有上传的文件都在/upload目录下,如:

site.com/upload/2012/a.jpg

但是URL的生成方式如下:“/upload/2012/a.jpg”。在这种情况下,可以通过a.site.com/upload/2012/a.jpg网址和b.site.com/upload/2012/a.jpg网址访问同一图片。

如何配置nginx以将指向/upload的所有请求重定向到site.com/upload。例如:

a.site.com/upload/2012/a.jpg => site.com/upload/2012/a.jpg

2 个答案:

答案 0 :(得分:2)

如果你有一个用于* .site.com的sepperate服务器块,

将以下内容添加到子域的配置中应该可以解决问题

location /upload/ {
  rewrite ^ http://site.com$request_uri permanent;
}

如果您在同一服务器块中捕获site.com和* .site.com,则需要添加额外的if语句:

location /upload/ {
  if( $host != site.com ) {
    rewrite ^ http://site.com$request_uri permanent;
  }
  # if we get here it's the main site
  # directives for serving http://site.com/upload/ go here
}

答案 1 :(得分:1)

Nginx不会生成网址。它是一个Web服务器。它回答了http://site.com/upload/2012/a.jpg之类的请求。

因此,您可以将html代码中的相对链接/upload/2012/a.jpg更改为绝对http://site.com/upload/2012/a.jpg,而不是更改nginx配置。或者更改子域名的nginx配置,nginx会为http://site.com/upload/2012/a.jpghttp://a.site.com/upload/2012/a.jpg以及http://b.site.com/upload/2012/a.jpg请求发送相同的图片。

如果您更喜欢更改配置,则必须为所有子域创建统一配置。 Because

  

按名称搜索虚拟服务器时,如果名称与多个指定的变体匹配,例如通配符名称和正则表达式匹配时,将按以下优先顺序

选择第一个匹配的变体
server {
    listen       80;
    server_name  *.site.com;

    location ^~ /upload {
         root   /real/path/to/upload/; 
         ...
    }

}

location directive manual