如何设置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。这甚至可能吗?
答案 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;
}
}
你必须在代码中编写伪函数,但你明白了。