2013-02-10 51 views
2

如果用户转到URL,说:http://www.domain.com/image/orange.jpgorange.jpg不存在,但是orange.png确实可以,.htaccess是否允许用户找到它?在这种情况下,htaccess可以帮助我吗?

+1

NO; htaccess没有使用列表swith可能的结果为每个请求;你为什么会回应一个无效的网址,仍然想找到正确的网址? – 2013-02-10 08:05:10

+0

也许启用[Multiviews](http://httpd.apache.org/docs/2.2/mod/mod_negotiation.html#multiviews)即可解决该问题。 – 2013-02-10 08:10:05

回答

1

这应该是可能的。 mod_rewrite允许检查文件的存在。并且它允许多次重写,以防止您不使用[L]标志主动停止该进程。 。

所以有这样的事情作为出发点(未经测试)一试:

RewriteEngine on 

RewriteCond %{REQUEST_URI} ^/image/([^/.]).jpg$ 
RewriteCond %{REQUEST_URI} !-f 
RewriteRule ^/image/([^/.]).jpg /image/$1.png 

RewriteCond %{REQUEST_URI} ^/image/([^/.]).png$ 
RewriteCond %{REQUEST_URI} !-f 
RewriteRule - /image/no-found [G,L] 

上述适用如果中央服务器配置(每个主机配置)中定义。对于.htaccess样式文件,其语法略有不同:RewriteRule中的前导斜杠(/)在该情况下不得存在。如果您有选择,请在服务器配置中进行重写。 .htaccess样式文件就像解决方法,非常容易出错。如果可能,尽量避免它们。

但请注意,这样的设置有点有限,并且很难维持。通常,这是一个更好的选择,可以设置一个小的包装脚本(可能是基于php)来处理请求,并在决定发送什么响应之前检查多个备选方案。你可以重写请求是这样的:

RewriteEngine on 
RewriteRule ^/image/([^/.])\..+$ /image.php?name=%1 

现在,您可以服务于该请求与脚本image.php,您可以检查图像的现有版本不匆忙,回到标题和内容的根据自己的喜好。

+0

+1的想法。但是,也许第一条规则是在存在时更改所请求文件的扩展名,而不是在不存在的情况下使用不同的扩展名获取另一条扩展名。不知道这是否是你的意图。 – 2013-02-10 08:56:18

+0

@faa对不起,我不明白你的意思。如果jpg变体不存在,第一条规则打算将'extension'从'.jpg' tp'.png'更改。这是OP所要求的。为什么不应该那个PNG变种呢? – arkascha 2013-02-10 10:07:49

+0

根据规则,只有具有'jpg'扩展名的请求文件存在时,才会传递'png'变体。这是一个积极的条件,规则要求“^ /无论......”,其中“无论”必须存在。也许你的意思是'!^ /无论什么......' – 2013-02-10 10:20:57

相关问题