Url rewriting 将子域上的已知文件夹重定向到nginx的主站点
我的CMS中有几个基于子域的站点,如: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
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/;
...
}
}