我正在尝试编写一组重写规则,将所有静态资产请求发送到我们的 CDN,同时将 PHP 文件的请求保留在服务器本地。我有一条适用于“匹配除 .php 之外的任何内容”的规则,但它也匹配网站的斜杠或根目录并将初始请求重定向到 CDN。
RewriteRule !^(.*\.php)$ http://somecdn.com/$1 [NC,L,R=301]
我一直在研究使用 RewriteCond 来取消斜线和 .php 文件的匹配,但我确信我只是遗漏了一块。
RewriteCond {REQUEST_URI} !^/$
RewriteCond {REQUEST_URI} !^(.*\.php)$
RewriteRule ^(.*)$ http://somecdn.com/$1 [NC,L,R=301]
这是我的第一条规则,但仍然与斜线匹配。
我怎样才能让它说“匹配除斜线和 .php 之外的所有内容,然后将其他所有内容发送到 CDN”?
答案1
适合我的情况的解决方案是将 RewriteCond 从 VirtualHost 块移出并移入 Directory 块。
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !^(.*\.php)$
RewriteRule ^(.*)$ http://somecdn.com/$1 [NC,L,R=301]
添加 !-d 来匹配任何非目录的内容,具有有益的副作用,即允许我们的 CMS 生成的干净 URL 在本地处理,而不是发送到 CDN。