試圖讓 Apache 服務於 webp 而不是 png/jpg(來自 prestashop 的 /img 文件夾)
第一次在這裡發帖,所以我希望我做得很好。
我從我的 prestashop public_html 文件夾開始將所有 png/jpg 轉換為 webp,並向 .htaccess 添加了重寫規則,以便提供 webp 而不是 png/jpg。
我的重寫基於已經存在的 prestashop 重寫。我在哪裡:
RewriteRule ^([0-9])(\-[_a-zA-Z0-9-]*)?(-[0-9]+)?/.+\.jpg$ %{ENV:REWRITEBASE}img/p/$1/$1$2$3.jpg [L]
我最終做了:
RewriteRule ^([0-9])(\-[_a-zA-Z0-9-]*)?(-[0-9]+)?/.+\.jpg$ %{ENV:REWRITEBASE}img/p/$1/$1$2$3.webp [L] RewriteRule ^([0-9])(\-[_a-zA-Z0-9-]*)?(-[0-9]+)?/.+\.webp$ %{ENV:REWRITEBASE}img/p/$1/$1$2$3.webp [L] RewriteRule ^([0-9])(\-[_a-zA-Z0-9-]*)?(-[0-9]+)?/.+\.jpg$ %{ENV:REWRITEBASE}img/p/$1/$1$2$3.jpg [L]
哪個有效:我得到了提供 webp 圖像的 jpg URL,到目前為止一切都很好(我知道仍然需要實現
#RewriteCond %{HTTP_ACCEPT} image/webp #RewriteCond %{DOCUMENT_ROOT}/$1.webp -f
並且嘗試弄清楚我是否應該離開
[L]
或做[L,T=image/webp]
或做[T=image/webp,E=REQUEST_image]
,這就是為什麼我正在閱讀與 apache 相關的文件並在網路上爬取關於重寫相關主題的內容,這確實是巨大的。好的,回到主題,我發現我缺少對 prestashop 儲存在 public_html/img 文件夾中的圖像的 webp 重寫。
然後我嘗試了以下(以及其他變體):
RewriteRule ^/img/(.+)\.jpe?g$ /img/$1.webp [L] RewriteRule ^/img/(.+)\.png$ /img/$1.webp [L]
^— 不好…仍然從 img 目錄提供 jpg/png 類型的圖像(仔細檢查 MIME 類型)。
注意:
- 每次我更改 .htaccess 並嘗試解決方案時,我都會清除 prestashop 記憶體,以防萬一(儘管知道每次請求都會讀取 .htaccess)。
- 存在 img 文件夾中 jpg/png 對應的 webp 圖片。
- 圖像文件 perms 在 img 文件夾中是正確的,實際上在 public_html 下的所有東西中都是正確的
- 在 prestashop 的 img 文件夾中,還有另一個 .htaccess,它限制了可以從此文件夾提供的文件類型,我已經添加了 webp,以防萬一有人問。
**更新:**根據 MrWhite 的要求,添加 img 文件夾的 .htaccess
<IfModule mod_php5.c> php_flag engine off </IfModule> # Apache 2.2 <IfModule !mod_authz_core.c> Order deny,allow Deny from all <Files ~ "(?i)^.*\.(webp|jpg|jpeg|gif|png|bmp|tiff|svg|pdf|mov|mpeg|mp4|avi|mpg|wma|flv|webm|ico)$"> Allow from all </Files> </IfModule> # Apache 2.4 <IfModule mod_authz_core.c> Require all denied <Files ~ "(?i)^.*\.(webp|jpg|jpeg|gif|png|bmp|tiff|svg|pdf|mov|mpeg|mp4|avi|mpg|wma|flv|webm|ico)$"> Require all granted </Files> </IfModule>
請問你們能幫我嗎?
RewriteRule ^/img/(.+)\.jpe?g$ /img/$1.webp [L] RewriteRule ^/img/(.+)\.png$ /img/$1.webp [L]
在文件中,模式
.htaccess
匹配的 URL 路徑不以斜杠開頭。所以上面的指令永遠不會匹配請求的 URL,所以不會做任何事情。在您之前的規則中,您將匹配數字作為第一個字元,而不是斜線。RewriteRule
例如,它應該是:
RewriteRule ^img/(.+)\.jpe?g$ /img/$1.webp [L]
然而…
在 prestashop 的 img 文件夾中,還有另一個
.htaccess
根據
/img/.htaccess
文件中包含的指令,這些指令可能會完全覆蓋父.htaccess
文件中的 mod_rewrite 指令。父級中的 mod_rewrite 指令.htaccess
甚至可能沒有得到處理。**更新:**現在看到
/img/.htaccess
文件就可以了 - 這些指令不會覆蓋父.htaccess
文件中關於將請求重寫到.webp
圖像的指令。由於這些附加規則僅適用於
/img
子目錄並且您在子目錄中已經有一個.htaccess
文件,因此/img
您可以將這些規則寫入/img/.htaccess
文件中(需要稍作調整)。例如:# /img/.htaccess RewriteEngine On RewriteRule ^(.+)\.jpe?g$ $1.webp [L]
該
RewriteRule
模式與**相對於包含該.htaccess
文件的目錄的 URL 路徑匹配。/img
因此,在這種情況下,它與子目錄不匹配。要完成規則並合併您提到的其他條件,您可以執行以下操作。現在回到根
.htaccess
文件:# /.htaccess # Rewrite image request to ".webp" if supported and exists RewriteCond %{HTTP_ACCEPT} image/webp RewriteCond %{DOCUMENT_ROOT}/$1.webp -f RewriteRule ^(img/.+)\.(jpe?g|png)$ $1.webp [L,T=image/webp]
如果保證相應的
.webp
圖像存在,那麼您不一定需要文件系統檢查(第二個條件)。(我不確定你為什麼需要
E=REQUEST_image
?)如果使用子目錄
.htaccess
中的文件:/img
# /img/.htaccess # Rewrite image request to ".webp" if supported and exists RewriteCond %{HTTP_ACCEPT} image/webp RewriteCond %{DOCUMENT_ROOT}/img/$1.webp -f RewriteRule ^(.+)\.(jpe?g|png)$ $1.webp [L,T=image/webp]
在旁邊:
RewriteRule ^([0-9])(\-[_a-zA-Z0-9-]*)?(-[0-9]+)?/.+\.jpg$ %{ENV:REWRITEBASE}img/p/$1/$1$2$3.webp [L] RewriteRule ^([0-9])(\-[_a-zA-Z0-9-]*)?(-[0-9]+)?/.+\.webp$ %{ENV:REWRITEBASE}img/p/$1/$1$2$3.webp [L] RewriteRule ^([0-9])(\-[_a-zA-Z0-9-]*)?(-[0-9]+)?/.+\.jpg$ %{ENV:REWRITEBASE}img/p/$1/$1$2$3.jpg [L]
第三條規則沒有做任何事情,應該被刪除。前兩個規則可以很容易地在文件副檔名上使用正則表達式交替組合。例如。
(jpg|webp)
.