在Apache中设置通用映像文件扩展名

时间:2013-03-26 16:12:03

标签: apache mod-rewrite

我正在尝试使用mod_rewrite使.img提供pngjpg文件,具体取决于给定文件名的可用内容(没有外部重定向)。

以下是我正在尝试的内容:

RewriteCond %{REQUEST_URI} !.*\.img [OR]
RewriteCond /var/www/html%{REQUEST_URI} -f
RewriteRule ^ - [S=3]

RewriteRule ^/?(.*)\.img$ /$1

RewriteCond %{REQUEST_FILENAME}.png -f
RewriteRule ^ $0.png [S=1,T=image/png]

RewriteCond %{REQUEST_FILENAME}.jpg -f
RewriteRule ^ $0.jpg [T=image/jpeg]

第一位似乎工作正常(它将.img文件重定向为没有扩展名),但后来的检查永远不会运行。关于mod_rewrite实际上是如何工作的我还不太清楚,但我认为这是因为重命名请求重新启动,并且因为它不再具有.img扩展名,所以第一条规则启动并阻止其他规则运行。但我不知道如何避免这种情况。

感谢任何帮助。

2 个答案:

答案 0 :(得分:0)

我明白了。我的原始代码非常接近;这是固定版本:

更新:这是一个正确显示404错误的版本(下面的版本会将mysite.com/mydirectory.img重定向到目录,这是奇怪的行为)

RewriteCond %{REQUEST_URI} !.*\.img [OR]
RewriteCond /var/www/html%{REQUEST_URI} -f
RewriteRule ^ - [S=4]

RewriteRule ^/?(.*)\.img$ /$1

RewriteCond /var/www/html%{REQUEST_FILENAME}.png -f
RewriteRule ^ /var/www/html%{REQUEST_FILENAME}.png [L,S=2,T=image/png]

RewriteCond /var/www/html%{REQUEST_FILENAME}.jpg -f
RewriteRule ^ /var/www/html%{REQUEST_FILENAME}.jpg [L,S=1,T=image/jpeg]

RewriteRule ^ - [R=404]

原始解决方案(无404检查):

RewriteCond %{REQUEST_URI} !.*\.img [OR]
RewriteCond /var/www/html%{REQUEST_URI} -f
RewriteRule ^ - [S=3]

RewriteRule ^/?(.*)\.img$ /$1

RewriteCond /var/www/html%{REQUEST_FILENAME}.png -f
RewriteRule ^ /var/www/html%{REQUEST_FILENAME}.png [S=1,T=image/png]

RewriteCond /var/www/html%{REQUEST_FILENAME}.jpg -f
RewriteRule ^ /var/www/html%{REQUEST_FILENAME}.jpg [T=image/jpeg]

要注意的事项是:

  • 我将根文件夹添加到文件检查中;似乎${REQUEST_FILENAME} 开始只是设置为%{REQUEST_URI},而第一次重写不会更改%{REQUEST_URI},而 更改 ${REQUEST_FILENAME},但保留URI格式。
  • 我将$0更改为%{REQUEST_FILENAME}。我不确定$0被设置为什么(可能是带有^正则表达式的空字符串),但是在我更改之前它会导致403 Forbidden错误。

如果它对其他人有帮助,我用这一行调试了它:

RewriteRule ^ /debug?u=%{REQUEST_URI}&f=%{REQUEST_FILENAME} [R]

以查询字符串的形式将变量发送到浏览器。

所以它有效。我仍然不知道mod_rewrite如何决定哪些规则在什么时间和什么输入运行,尽管写了很多这些东西并阅读了大部分文档......

答案 1 :(得分:0)

您可以尝试这样做:

RewriteCond %{REQUEST_FILENAME} /(.*)\.img$
RewriteCond /%1.png -f
RewriteRule ^ /%1.png

RewriteCond %{REQUEST_FILENAME} /(.*)\.img$
RewriteCond /%1.jpg -f
RewriteRule ^ /%1.jpg

如果这样做,则每次请求只需要重写一次。