在開(kāi)發(fā)web應(yīng)用時(shí),瀏覽器的安全策略慢慢的變嚴(yán)格,一些跨域的操作都無(wú)法在正常操作。而現(xiàn)在這個(gè)云時(shí)代,我們可能很多服務(wù)依賴(lài)第三方的服務(wù)廠家,這樣就導(dǎo)致了應(yīng)用要不可避免的進(jìn)行一些跨域操作。
可以修改瀏覽器的一些默認(rèn)策略,來(lái)實(shí)現(xiàn)目的,但是瀏覽器版本眾多,廠家也多,適配起來(lái)會(huì)稍微花一點(diǎn)時(shí)間。
因此想到使用Nginx做代理,來(lái)進(jìn)行跨域請(qǐng)求,而其他請(qǐng)求正常訪問(wèn)nginx。這樣保證在同一個(gè)域名下操作。
操作
# root /usr/local/nginx/html/taobao;
server {
listen 80;
server_name *.ai-he.me;
index index.html index.htm index.php;
charset utf-8;
location = /favicon.ico {
access_log off;
log_not_found off;
}
location = /robots.txt {
access_log off;
log_not_found off;
}
### 重點(diǎn)部分,請(qǐng)求到此處停止
location ^~ /wantu/upload/ {
# 這一句是設(shè)置代理請(qǐng)求的頭部,域名設(shè)置為自己的域名
proxy_set_header Host aihe.image.alimmdn.com;
if ( $host ~* "^xx" ){
rewrite_by_lua_block {
local uri = ngx.re.sub(ngx.var.uri, "^/wantu/upload/(.*)", "/$1");
ngx.req.set_uri(uri);
}
proxy_pass http://aihe.image.alimmdn.com;
break;
}
}
####----
location ~* \.(jpg|jpeg|png|gif|ico|css|js|map|woff|woff2|txt)$ {
access_log off;
add_header Cache-Control "public";
add_header cache-status $upstream_cache_status;
proxy_cache cache;
error_log logs/static-error.log warn;
expires 30d;
root html;
}
location ~ /\.ht {
deny all;
}
}
以上是配置代理的關(guān)鍵部分。做一下解釋
-
location ^~ /wantu/upload/,nginx請(qǐng)求匹配到這一步便終止請(qǐng)求,不再繼續(xù)匹配。
proxy_set_header Host aihe.image.alimmdn.com,設(shè)置請(qǐng)求的Host,有時(shí)候可以不用設(shè)置,不設(shè)置的話,nginx會(huì)自動(dòng)將下面的proxy_pass代理的域名解析為地址。-
lua重寫(xiě)請(qǐng)求。
lua與nginx的請(qǐng)求處理流程
根據(jù)lua的處理過(guò)程,我們可以自定義代碼塊。
如果請(qǐng)求是以xx開(kāi)頭的域名,就重寫(xiě)請(qǐng)求,將路徑開(kāi)頭的/wantu/upload/去除。然后在將請(qǐng)求代理到我們想要指定的域名。
if ( $host ~* "^xx" ){
rewrite_by_lua_block {
local uri = ngx.re.sub(ngx.var.uri, "^/wantu/upload/(.*)", "/$1");
ngx.req.set_uri(uri);
}
proxy_pass http://aihe.image.alimmdn.com;
break;
}
當(dāng)然這一步不使用lua語(yǔ)句也可以,使用nginx的rewrite模塊,也是可以做到的。
最后
這里只是提供一點(diǎn)nginx反向代理其它域名的思路,方式應(yīng)該有很多,僅供參考。
