1 回答

TA貢獻1906條經(jīng)驗 獲得超3個贊
我的標(biāo)準(zhǔn)做法是通過框架路由控制資源訪問。一個示例實現(xiàn)(在 Lumen 中):
$router->get('/asset[/{path:.*}]', 'AssetController@load');
示例請求和響應(yīng)如下所示:
GET /asset/js/app.js HTTP/1.1
Host: localhost:8080
Connection: keep-alive
Pragma: no-cache
Cache-Control: no-cache
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.100 Safari/537.36
Accept: */*
Referer: http://localhost:8080/spa/example
Accept-Encoding: gzip, deflate, br
Accept-Language: en-US,en;q=0.9
HTTP/1.1 200 OK
Server: nginx
Content-Type: application/javascript
Content-Length: 21056410
Connection: keep-alive
Last-Modified: Sun, 31 Jul 63 19:34:21 +0000
Cache-Control: private, must-revalidate
Date: Wed, 31 Jul 2019 19:34:21 GMT
Accept-Ranges: bytes
X-XSS-Protection: 1; mode=block
X-Content-Type-Options: nosniff
Content-Security-Policy: default-src 'self'; connect-src 'self'; img-src 'self'; style-src 'unsafe-inline' fonts.googleapis.com 'self'; font-src fonts.gstatic.com 'self'; script-src 'unsafe-inline' 'self' 'unsafe-eval'
您的控制器(例如,AssetController在我之前的示例中)會注意將 URL 路徑轉(zhuǎn)換為文件系統(tǒng)路徑(注意..和其他技巧,使用realpath并將其與代碼的安裝基本路徑進行比較),設(shè)置Content-Type和Content-Length標(biāo)題,任何相關(guān)的緩存標(biāo)頭,然后流式傳輸文件。
雖然這確實增加了復(fù)雜性和一定數(shù)量的開銷,但它提供了通過業(yè)務(wù)邏輯限制資源的靈活性。
如果性能是一個問題,您可以促進對 Web 服務(wù)器的訪問或屏蔽 CDN 和代理內(nèi)容后面的路由。
- 1 回答
- 0 關(guān)注
- 225 瀏覽
添加回答
舉報