如果目标网址不存在,如何使用回退设置mod_rewrite?

时间:2014-04-02 17:58:40

标签: .htaccess mod-rewrite

如何设置mod_rewrite,如果目标网址不存在,它可以检查下一个规则,然后检查下一个规则,直到找到现有网址?

我的情况是我在远程CDN上有一组图像文件。我使用mod_rewrite通过这样的重写来掩盖这些图像的实际URL(非常简化的示例):

THIS:    http://mydomain.com/123456789/image.jpg?num=1
TO THIS: http://123456789.remoteserver.com/image1.jpg

THIS:    http://mydomain.com/123456789/image.jpg?num=3
TO THIS: http://123456789.remoteserver.com/image3.jpg

这是我当前mod_rewrite的简化示例,以帮助可视化:

RewriteCond %{QUERY_STRING} ^num=([0-9]+)$
RewriteRule ^([0-9-]+)/image.jpg$ http://$1.remoteserver.com/image%1.jpg [P]

它按原样完美,但我需要稍微复杂一点,以便如果" image1.jpg"它不存在,它可以检查" image2.jpg,"如果它不存在,它可以检查" image3.jpg,"等 - 最多5或6个不同的图像 - 并重写到它找到的第一个现有URL。这甚至可能吗?

1 个答案:

答案 0 :(得分:0)

  

它完美无缺,但是我需要稍微复杂一点,如果“image1.jpg”不存在,它可以检查“image2.jpg”,如果不存在,它可以检查“image3.jpg”等 - 最多5或6个不同的图像 - 并重写到它找到的第一个现有URL。这甚至可能吗?

不是mod_rewrite。当它到达[P]标志并结束重写时,URL处理管道继续运行,mod_rewrite 将永远不知道该请求是如何解决的。换句话说,它永远不会知道image1.jpg是否存在,是否存在错误,请求是否超时等等。

您可能必须使用脚本或其他东西来执行此操作。例如,如果您将规则更改为:

RewriteCond %{QUERY_STRING} ^num=([0-9]+)$
RewriteRule ^([0-9-]+)/image.jpg$ /proxy_image.php?path=$1&num=%1 [L]

然后在proxy_image.php脚本中,有类似的内容:

$num = $_GET['num'];
$success = false;
while($success == false) {
    $image = "image" . $num . ".jpg";
    $url = "http://" . $_GET['path'] . ".remoteserver.com/" . $image;
    $contents = loadImageUrl($url);
    if($contents === 0) {
        $success = false;
        $num++;
    }
    else {
        returnToBrowser($contents);
        break;
    }
}

你必须在代码中编写伪函数,但你明白了。