Apache2 - 似乎并不总是应用重写条件

时间:2014-10-14 00:06:36

标签: mod-rewrite apache2 browser-refresh

我想仅在图像文件不存在时重定向到/lost/index.php。 当我尝试它 - 似乎它不适用于浏览器刷新 如果我使用服务器上存在的文件调用它

/images/image1.jpg
  • 它显示了一个文件(GOOD - 文件存在) 但如果我刷新浏览器,它会将我重定向到/lost/index.php(很糟糕)

低于我的规则

RewriteEngine On
RewriteLog      /var/log/apache2/rewrite.log
RewriteLogLevel 3

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^/images/(.*)$    /lost/index.php?image=$1 [L,R]

有什么想法吗?

1 个答案:

答案 0 :(得分:0)

所以我解决了。

如果在元素内定义重写规则,它们应该看起来像

<Directory /var/www/local.example.com>

        ...
        RewriteEngine On

        RewriteCond %{REQUEST_FILENAME} !-l
        RewriteCond %{REQUEST_FILENAME} !-d
        RewriteCond %{REQUEST_FILENAME} !-f
        RewriteRule ^images/(.*)$    /lost/index.html?image=$1 [R]
</Directory> 

如果你定义它们&#34;全球&#34;在(每服务器上下文)之外,它们应该看起来像

RewriteEngine On
RewriteCond %{LA-U:REQUEST_FILENAME} !-l
RewriteCond %{LA-U:REQUEST_FILENAME} !-d
RewriteCond %{LA-U:REQUEST_FILENAME} !-f
RewriteRule ^/images/(.*)$    /lost/index.html?image=$1 [R] 

这是因为如果在每个服务器上下文中使用(即,在请求映射到文件系统之前),SCRIPT_FILENAME和REQUEST_FILENAME不能包含完整的本地文件系统路径,因为在此处理阶段路径是未知的。在这种情况下,两个变量最初都将包含REQUEST_URI的值。为了在每服务器上下文中获取请求的完整本地文件系统路径,请使用基于URL的预览%{LA-U:REQUEST_FILENAME}来确定REQUEST_FILENAME的最终值。

同样重要的是 - 两种情况下的模式必须不同。在第二种情况下,它必须以&#39; /&#39;开头。而在第一个不是。这是因为REQUEST_FILENAME包含&#39; /&#39;在第二种情况的开始,但它不适用于第一种情况