0

我正在尝试使用 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扩展名,所以第一条规则启动并阻止其他规则运行。但我不知道如何避免这种情况。

任何帮助表示赞赏。

4

2 回答 2

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 是如何决定哪些规则在什么时间和什么输入下运行的,尽管我写了很多这些东西并阅读了大部分文档……</p>

于 2013-03-26T16:38:31.667 回答
0

你可以试试这个:

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

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

如果这可行,那么每个请求只需要一次重写。

于 2013-03-26T21:36:23.040 回答