仅当存在查询字符串时才适用于图像文件请求的 RewriteRule

2024-04-03

由于我有限的正则表达式和 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(使用前将#替换为@)

仅当存在查询字符串时才适用于图像文件请求的 RewriteRule 的相关文章

随机推荐

  • 禁用/隐藏辅助功能元素

    我试图从 VoiceOver 中隐藏应用程序中的多个元素 以便屏幕阅读器不会大声朗读它们 在 iOS 上 我设置isAccessibilityElement to NO 但这对 OSX 没有影响 从 VoiceOver 隐藏元素的正确方法是
  • Firebase LatLng 缺少不带参数的构造函数

    我将坐标存储在实时数据库中 但在尝试检索数据时收到错误消息 错误信息是 com google firebase database DatabaseException com google android gms maps model Lat
  • np.argsort 和 pd.nsmallest 给出不同的结果

    示例数据和代码如下 import pandas as pd import numpy as np np random seed 2021 dates pd date range 20130226 periods 90 df pd DataF
  • 由于 Windows 更新,Azure 云服务应用程序(Web 角色)偶尔会停机约 10 分钟?我该如何安排它们?

    它似乎每隔几个月左右就会发生一次 虽然它通常会在大约 10 分钟内自动恢复 但我仍然想了解如何更改 Windows 更新计划 因为它经常在工作时间发生 我们在各种 Azure 订阅中有多个 Web 应用程序 它们都以这种方式运行 一旦我们收
  • 并排 div

    如何并排放置两个 div 并在它们之间使用分离器 那就是我的意思 我假设 html 布局看起来像这样 div div div div div div div div or div div div div div div div div ht
  • 通过 HTTPS 以 JSON 格式发送密码是否安全?

    如果我通过 HTTPS 发送 JSON 格式的密码来执行身份验证 安全吗 有更好的方法吗 一般来说 将用户名和密码发送到服务器以执行身份验证的最佳方法是什么 一般来说 是的 这对于被动网络窃听者是安全的 这是人们在这种架构中担心的主要威胁
  • 预加载器继续加载并且在加载内容时不会消失

    好的 首先 这是我的代码 var loader document getElementById loader window addEventListener loader function loader style display none
  • 是否有与 C++ std::partial_sort 等效的 C# ?

    我正在尝试为可通过许多标准排序的数据集实现分页算法 不幸的是 虽然其中一些标准可以在数据库级别实现 但有些必须在应用程序级别完成 我们必须与另一个数据源集成 我们有分页 实际上是无限滚动 要求 并且正在寻找一种方法来最大程度地减少每次分页调
  • ASP.NET-Identity:如何限制用户名长度?

    我怎样才能限制长度UserName表中的字段AspNetUsers 这都不是 public class ApplicationUser IdentityUser Required MaxLength 15 public string Use
  • C# 7 基于元组的变量交换线程安全吗?

    在 C 7 的元组之前 交换两个变量的标准方法如下 var foo 5 var bar 10 var temp foo foo bar bar temp 但现在我们可以使用 foo bar bar foo 它在一条线上 而且更漂亮 但它是线
  • 绘图错误“您的浏览器不支持 WebGL”

    我正在尝试使用创建一些 3D 绘图plotly包裹 我使用的代码是他们的教程示例 library plotly volcano is a numeric matrix that ships with R fig lt plot ly z v
  • 使用 RC.EXE 或 BRCC32.EXE 构建 *.rc 文件时包含文件的行为有所不同

    我希望在我的 Delphi 项目的 RC 文件中使用点 作为资源条目 但是 Delphi 的 BRCC32 exe 不允许在资源命名中使用点 从Delphi 2010开始 我们可以在中指定 要使用的资源编译器 Project Option
  • 非常简单的 Firestore 事务失败

    我正在为一项超级简单的交易而苦苦挣扎 它总是失败并显示消息 事务所有重试均失败 但除此之外没有任何错误消息logcat 当我调试它时 我发现它被重试了几次 我真的不知道为什么 因为其他交易运行没有问题 我只想将一个文档从一个集合克隆到另一个
  • 使用 UIImagePickerController 时出现内存警告

    当我在 iPhone 上使用相机时收到内存警告 我也在使用 ARC 当您拍照并按相机视图控制器上的 使用照片 按钮时 我会收到内存警告 目的是一旦按下 使用照片 按钮 它就会更改 ImageView 的内容 我认为内存问题可能是由于捕获的图
  • 如何在 Sublime Text 中格式化 django 模板

    如何在 Sublime Text 中格式化 django 模板 我的模板包括 HTML django 模板语言与 variable and stuff javascript 有没有办法获得 PyCharm 提供的相同类型的格式 这个包应该可
  • 在 Blazor 中增加文本区域

    我需要一个随着行数增加而增长的文本区域 一旦行被删除 TextArea 就会再次缩小 在最好的情况下具有最大高度 它如何与 Javascript 一起工作我已经可以在这里阅读 根据内容长度调整文本区域大小 https stackoverfl
  • Spring中Bean创建异常

    我正在尝试自动装配在另一个项目中声明的类 但是在我收到运行时异常而不是编译时异常 如果我删除自动装配并使用新实例创建一个对象 它会完美运行 我收到以下错误 ErrorSEVERE StandardWrapper Throwable org
  • 如何通过Java程序调节扬声器音量?

    我运行的是 Win Vista 在窗口右下角的时钟旁边有一个扬声器图标 我可以单击它并调整音量 我想知道我的 Java 程序中是否有办法自动执行此操作 例如 当我的Java程序启动时 它将音量调至80 当程序退出时 它将音量调回原来的水平
  • Bouncy castle 中使用 SHA256 的 ECDSA 抛出无此类算法异常

    我正在尝试使用生成签名ECDSA with SHA256 in Bouncy Castle如下 我在开头添加了提供者 我已经构建了 ECPrivatekey Signature s oSignature Signature getInsta
  • 仅当存在查询字符串时才适用于图像文件请求的 RewriteRule

    由于我有限的正则表达式和 mod rewrite 能力 我正在尝试重写某些图像请求 以便我可以使用 php 脚本更改输出 这是我所拥有的 RewriteRule public uploads A Za z0 9 JPEG JPG GIF P