我想到了。我的原始代码非常接近;这是固定版本:
更新:这是一个正确显示 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>