Dot-Htaccess

試圖讓 Apache 服務於 webp 而不是 png/jpg(來自 prestashop 的 /img 文件夾)

  • March 17, 2022

第一次在這裡發帖,所以我希望我做得很好。

我從我的 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 類型)。

注意:

  1. 每次我更改 .htaccess 並嘗試解決方案時,我都會清除 prestashop 記憶體,以防萬一(儘管知道每次請求都會讀取 .htaccess)。
  2. 存在 img 文件夾中 jpg/png 對應的 webp 圖片。
  3. 圖像文件 perms 在 img 文件夾中是正確的,實際上在 public_html 下的所有東西中都是正確的
  4. 在 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).

引用自:https://serverfault.com/questions/1096330