如何重置 Apache 的 RewriteCond 指令?

Dis*_*oat 6 mod-rewrite rewritecond apache-2.2

我有一些这样的 Apache 配置:

# Image hotlinking rule
RewriteCond %{HTTP_REFERER} ^http://badsite\.com/
RewriteRule .*/static/artwork/.*\.(jpg|png)$ /static/images/hotlink.png [L]

# Redirects
RewriteRule ^static/artwork/(.+)$    http://cdn.mysite.com/artwork/$1    [L,R=301]

# CodeIgniter
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ /index.php/$1 [L]
Run Code Online (Sandbox Code Playgroud)

它应该执行以下操作:

  1. 如果对图像的请求来自badsite.com,则阻止它并显示热链接图像。
  2. 如果收到对图像的常规请求,则重定向到托管在 cdn 子域上的图像。
  3. 否则,如果请求不是文件或目录,则加载网页页面(通过 CodeIgniter)。

但是,我认为第一个RewriteCond适用于重定向规则,而不是盗链规则,因为来自该引用者的图像请求被重定向到 CDN,而不是盗链图像。Apache 文档中的一个示例(本节底部)暗示换行符停止RewriteCond应用,但这并没有发生。

有没有办法“重置”RewriteCond规则,或者我的配置中是否有其他错误?

Sha*_*den 6

换行完全无关紧要;aRewriteCond只适用于一个RewriteRule;直接在它下面的那个。

提供有关您的配置的更多信息会很有帮助,因为上下文在 Apache 中是相关的。但是,从您的第二个RewriteRule工作的事实来看,此配置似乎是在<Directory>上下文或.htaccess文件中设置的,并且/static位于该上下文的根目录中。

鉴于此,您首先RewriteRule将永远不会匹配。改变你的模式..

.*/static/artwork/.*\.(jpg|png)$
Run Code Online (Sandbox Code Playgroud)

..到..

^static/artwork/.*\.(jpg|png)$
Run Code Online (Sandbox Code Playgroud)