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

Url rewriting 将子域上的已知文件夹重定向到nginx的主站点,url-rewriting,nginx,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.jpgURL和b.site.com/upload/2012/a.jpgURL访问相同的图像 如何配置nginx将指向/upload的所有请求重定向到site.com/uplo

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

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

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

如果您有*.site.com的seperate服务器块,将以下内容添加到子域的配置中应该可以做到这一点

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
}

Nginx不生成url。它是一个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.jpg
http://a.site.com/upload/2012/a.jpg
http://b.site.com/upload/2012/a.jpg
请求

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

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


我的子域不是静态的,我无法将此规则添加到子域中。您的nginx如何处理不同的域?一个服务器块同时捕获主域和所有子域,一个服务器块用于主域,另一个服务器块带有“server_name*.site.com;”用于子域,还有别的吗?在前一种情况下,您需要在重写前后在$host上进行额外的if匹配,在第二种情况下,块应按原样工作。@cobaco,虽然这在这种特殊情况下可能不重要,但您可能需要在位置中添加尾随“/”以不匹配“/上载文件”等,并添加尾随“?”在$request_uri之后重写,以避免查询字符串重复。斜杠的优点很好。复制品从何而来?您明确地告诉nginx要重写到什么,并且只包含$args一次(间接地说,$request\u uri是包含任何参数的原始请求)@cobaco,from:如果替换字符串包含新的请求参数,则之前的请求参数将附加在它们之后。如果这是不需要的,在替换字符串的末尾加一个问号可以避免附加它们
server {
    listen       80;
    server_name  *.site.com;

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

}