由于我有限的正则表达式和 mod_rewrite 能力,我正在尝试重写某些图像请求,以便我可以使用 php 脚本更改输出。这是我所拥有的:
RewriteRule ^(public|uploads)/([A-Za-z0-9/_-]+).(JPEG|JPG|GIF|PNG|jpeg|jpg|gif|png)$ public/images.php?%{QUERY_STRING}&src=$1/$2.$3 [L]
# [ 1 ] [ 2 ] [ 3 ]
这个确实有效,但是太贪心了,不行require查询字符串,这很重要 - 否则所有图像请求都将被重写。我尝试放一个?
or ?(.*)
在规则中,我要么会收到内部服务器错误,要么似乎无法解决问题(很可能是因为我没有正确执行)。我也尝试过%{QUERY_STRING}
在病情结束时,但这似乎没有影响任何事情。
这就是我想要发生的事情:
- 任何要求
public/
or uploads/
...
- 后跟图像的任何路径(文件扩展名不区分大小写)...
- 后面跟着一个查询字符串...
- ...应该重写为
public/images.php
与原始查询字符串,并添加一个附加参数:src
,其中包含图像的实际路径(重写的部分)。
- 额外的“would-be-nice”,但不是必需的:将规则限制为仅在查询字符串至少包含一组参数中的一项时才重写 url。例如,仅当其中之一
width=
, height=
or contrast=
参数存在。如果这让事情变得臃肿或复杂,我并不担心。
例如,请求:
uploads/images/my_folder/test.jpg?width=320&height=220
应由以下人员提供服务:
public/images.php?width=320&height=220&src=public/images/my_folder/test.jpg
The .htaccess
文件位于我的根目录中,以及public
and uploads
目录。
我想避免使用绝对网址,因为我希望它可以移植而无需编辑。我已经做了很多谷歌搜索和阅读相关的 SO 帖子,但仍然无法弄清楚这个问题。我怎样才能修补这个规则来完成我想要的事情,或者有没有更好的方法来完全编写这个规则?
Edit:只是想指出这条规则以前对我有用:
RewriteRule ^(public|uploads)/([A-Za-z0-9/_-]+).(JPEG|JPG|GIF|PNG|jpeg|jpg|gif|png)/([0-9]+)$ public/images.php?width=$4&src=$1/$2.$3
...但仅适用于类似的请求uploads/my_folder/image.jpg/280
- 我使用 280 作为宽度,但现在我想接受不按特定顺序排列的多个参数的组合:
两种方法:
1.添加一个条件,仅在查询字符串不为空(可以是任何内容)时重写:
RewriteCond %{QUERY_STRING} !^$
RewriteRule ^(public|uploads)/([A-Za-z0-9/_-]+)\.(jpe?g|gif|png)$ public/images.php?src=$1/$2.$3 [NC,QSA,L]
2.添加一个条件,仅当查询字符串不为空并且至少存在其中一个参数时才重写(但该值可以为空):
RewriteCond %{QUERY_STRING} (^|&)width=([^&]*)(&|$) [OR]
RewriteCond %{QUERY_STRING} (^|&)height=([^&]*)(&|$) [OR]
RewriteCond %{QUERY_STRING} (^|&)contrast=([^&]*)(&|$)
RewriteRule ^(public|uploads)/([A-Za-z0-9/_-]+)\.(jpe?g|gif|png)$ public/images.php?src=$1/$2.$3 [NC,QSA,L]
我还没有真正测试过#2 ..但应该可以正常工作(从完全工作的代码复制)。
NOTES:
您可以更换^(public|uploads)/([A-Za-z0-9/_-]+)\.(jpe?g|gif|png)$
by ^((?:public|uploads)/(?:[A-Za-z0-9/_-]+)\.(?:jpe?g|gif|png))$
..然后代替src=$1/$2.$3
仅使用src=$1
或者——替换^(public|uploads)/([A-Za-z0-9/_-]+)\.(jpe?g|gif|png)$
by ^(?:public|uploads)/[A-Za-z0-9/_-]+\.(?:jpe?g|gif|png)$
然后使用src=${REQUEST_URI}
——唯一的区别是src=
参数将以斜杠开头。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)