我有兩種路由機制
- 如果是 png 或 jpeg,則重定向到名為 assets 的檔案夾
- 如果不是 png 或 jpeg,則重定向到 index.php
現在我想擴展檔案型別,但我不想一一寫,如何檢查url末尾是否有擴展名?
當前重定向(手動);
RewriteCond %{REQUEST_URI} \.(jpe?g|bmp|png|gif|svg|webp|mp3|mp4|css|js|woff2|woff|ttf|html|map)$
RewriteCond %{REQUEST_URI} frontend/assets
RewriteRule ^(.*)$ $1 [NC,L,END]
我試過了什么;
RewriteCond %{REQUEST_URI} !^\.(.*)$
RewriteCond %{REQUEST_URI} frontend/assets
RewriteRule ^(.*)$ $1 [NC,L,END]
uj5u.com熱心網友回復:
你可以這樣做:
DirectoryIndex index.php
RewriteEngine On
# 1. Exception for URL requests that contain a file extension
# - Prevents further processing
RewriteRule \.\w{2,5}$ - [END]
# 2. Rewrite everything else (including directory requests) to "index.php"
RewriteRule . index.php [END]
“檔案擴展名”被認為是一個點,后跟 2 到 5 個字符,范圍為?? 、a-z和(下劃線)。A-Z0-9_
盡管上述兩條規則可以合二為一:
# 1 2. Rewrite everything that does not have a file extension to "index.php"
RewriteRule !\.\w{2,5}$ index.php [END]
(細微的區別是這個規則也重寫了根目錄,index.php而不是依賴于 mod_dir。)
如果您只是想將所有內容路由到index.php,除了檔案和目錄,那么只需使用以下內容(這將替換上面的所有內容):
FallbackResource /index.php
看看你目前的規則:
RewriteCond %{REQUEST_URI} \.(jpe?g|bmp|png|gif|svg|webp|mp3|mp4|css|js|woff2|woff|ttf|html|map)$ RewriteCond %{REQUEST_URI} frontend/assets RewriteRule ^(.*)$ $1 [NC,L,END]
這是一個“例外”。如果滿足條件,它會阻止進一步處理。(它實際上并沒有做任何進一步處理 URL 的事情,它只是防止請求被重寫到前端控制器,這大概會隨之而來。)
似乎不需要檢查請求的 URL 是否以檔案擴展名結尾并且 URL 路徑是否包含frontend/assets. 如果您的所有資產都包含在已知位置,那么可以說最好排除該已知位置。盡管您還在評論中提到了一個.php擴展,它可能不屬于“資產”。
也不需要捕獲請求的 URL 路徑并將請求重寫為相同的。要表示“無替換”,只需使用一個連字符(就像我在上面的規則中所做的那樣)。
NC和標志在L這里也是多余的。END是一個“更強”的版本,L可以防止重寫引擎進一步通過。
RewriteCond %{REQUEST_URI} !^\.(.*)$ :
除了正則運算式也不正確之外,這種否定運算式的作用與您試圖實作的相反。當請求的 URL-path 與表單的 URL 不匹配時,此條件.<anything>成功。這總是會成功的,因為REQUEST_URI服務器變數總是以斜杠開頭。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/459215.html
