我正在尝试使用mod_rewrite使.img
提供png
或jpg
文件,具体取决于给定文件名的可用内容(没有外部重定向)。
以下是我正在尝试的内容:
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
扩展名,所以第一条规则启动并阻止其他规则运行。但我不知道如何避免这种情况。
感谢任何帮助。
答案 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
如果这样做,则每次请求只需要重写一次。