如果不考慮CDN迴流的話。
對於跨域,需要請求協議、域名、端口3者有1個不同,即是跨域。
那麼怎麼解決跨域,原始方法是JSONP,那個時代技術有限,現在都是Cors技術。
現在,前端發給後端,後端例如golang可以如下配置:
當然,具體用法見官方文檔。
然後就是vue開發階段,我的訪問url是localhost:3000.
前端直傳oss,爲了分佈式考慮,跨域訪問了。
那麼,這時可以在阿里雲的oss管理界面設置js跨域規則:
我這裏就簡單粗暴點了:
然後前端重新請求:
這裏實際上後端對OSS是做了處理的:
package service
import (
"giligili/serializer"
"mime"
"os"
"path/filepath"
"github.com/aliyun/aliyun-oss-go-sdk/oss"
"github.com/google/uuid"
)
// UploadTokenService 獲得上傳oss token的服務
type UploadTokenService struct {
Filename string `form:"filename" json:"filename"`
}
/**
簽名保證私有,且阿里雲的bucket中我手動配置了防盜鏈和私有bucket,不用擔心別人吃我流量。
*/
// Post 創建token
func (service *UploadTokenService) Post() serializer.Response {
client, err := oss.New(os.Getenv("OSS_END_POINT"), os.Getenv("OSS_ACCESS_KEY_ID"), os.Getenv("OSS_ACCESS_KEY_SECRET"))
if err != nil {
return serializer.Response{
Status: 50002,
Msg: "OSS配置錯誤",
Error: err.Error(),
}
}
// 獲取存儲空間。
bucket, err := client.Bucket(os.Getenv("OSS_BUCKET"))
if err != nil {
return serializer.Response{
Status: 50002,
Msg: "OSS配置錯誤",
Error: err.Error(),
}
}
// 獲取擴展名
ext := filepath.Ext(service.Filename)
// 帶可選參數的簽名直傳。
options := []oss.Option{
oss.ContentType(mime.TypeByExtension(ext)),
}
// 上傳視頻封面: 通過uuid避免不同人上傳封面覆蓋(同名)
key := "upload/avatar/" + uuid.Must(uuid.NewRandom()).String() + ext
// 簽名直傳。
signedPutURL, err := bucket.SignURL(key, oss.HTTPPut, 600, options...)
if err != nil {
return serializer.Response{
Status: 50002,
Msg: "OSS配置錯誤",
Error: err.Error(),
}
}
// 查看圖片
signedGetURL, err := bucket.SignURL(key, oss.HTTPGet, 600)
if err != nil {
return serializer.Response{
Status: 50002,
Msg: "OSS配置錯誤",
Error: err.Error(),
}
}
return serializer.Response{
Data: map[string]string{
"key": key,
"put": signedPutURL,
"get": signedGetURL,
},
}
}
對於oss的bucket,最好設置私有的,
且爲了不要被別人請求而浪費流量可以設置防盜鏈和refer:
重要的是看response,可以看到如上headers就成功了。
OPTIONS請求是“探測”。
是通過OPTIONS請求去探測然後再發真正的請求。
即這2個請求的max-age時間段內發,前端一般是一起發。
MAX-Age: 0 代表無限。
OPTIONS請求不應該像普通的請求(GET POST)一樣做業務處理,而只是負責探測。
子域名也會遵守跨域規則。
golang後端配置前端請求跨域,注意
這裏的origin的協議(http/https)、域名、端口只要1個沒寫對,那麼就掛了。