6

我的 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.jpgURL 和b.site.com/upload/2012/a.jpgURL 访问相同的图像。

如何配置 nginx 以重定向所有/upload指向site.com/upload. 例子:

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

2 回答 2

2

如果您有 *.site.com 的单独服务器块,则将以下内容添加到子域的配置中应该可以解决问题

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
}
于 2012-08-31T16:49:54.270 回答
1

Nginx 不生成 url。它是一个网络服务器。它回答诸如http://site.com/upload/2012/a.jpg.

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

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

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

server {
    listen       80;
    server_name  *.site.com;

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

}

位置指令手册

于 2012-09-04T00:42:36.480 回答