Mod-Rewrite
RewriteRule 適用於“匹配一切”模式,但不適用於目錄模式
我正在嘗試將時事通訊 URL 從我的本地伺服器重定向到 Amazon S3 儲存桶。
所以我想從以下位置重定向:
https://mysite.com/assets/img/newsletter/Jan12_Newsletter.html
到:
https://s3.amazonaws.com/mybucket/newsletters/legacy/Jan12_Newsletter.html
這是我的規則的第一部分:
RewriteEngine On RewriteBase / # Is it in the newsletters directory RewriteCond %{REQUEST_URI} ^(/assets/img/newsletter/)(.+) [NC] # Is not a 2008-2011 newsletter RewriteCond %{REQUEST_URI} !(.+)(11|10|09|08)_Newsletter.html$ [NC] ## -> RewriteRule to S3 Here <- ##
如果我使用它
RewriteRule
指向 S3 上的新子目錄,它將不會重定向:
RewriteRule ^(/assets/img/newsletter/)(.+) https://s3.amazonaws.com/mybucket/newsletters/legacy/$2 [R=301,L]
但是,如果我使用一攬子表達式來擷取整個文件路徑,它將重定向:
RewriteRule ^(.*)$ https://s3.amazonaws.com/mybucket/newsletters/legacy/$1 [R=301,L]
為什麼它只適用於“匹配所有”表達式而不適用於更具體的表達式?
由於您已經在第一個
RewriteCond
塊中擷取了您感興趣的 URI 部分,因此您不必再次擷取它來執行RewriteRule
,並且由於您的兩個RewriteCond
s 都滿足,因此無需第三次解析 URI ,所以一個簡單的插入符號就可以了。# Is it in the newsletters directory RewriteCond %{REQUEST_URI} ^/assets/img/newsletter/(.+) [NC] # Is not a 2008-2011 newsletter RewriteCond %{REQUEST_URI} !(?:11|10|09|08)_Newsletter.html$ [NC] RewriteRule ^ https://s3.amazonaws.com/mybucket/newsletters/legacy/%1 [R=301,L]
因此,這應該可以解決問題(來自 s 的匹配
RewriteCond
以 an 為前綴,%
而不是$
)。它可能無法解釋為什麼您的
RewriteRule
不匹配,因為它對我來說看起來不錯,但是使用這種方法,它是不必要的。