【问题标题】:Rewrite image url with htaccess用 htaccess 重写图片 url
【发布时间】:2021-10-28 08:05:22
【问题描述】:

这个 htaccess 示例被标记为正在运行。我没有使用 htaccess 的经验。我想要做的是用 htaccess 重写图像 url。

RewriteEngine On 
RewriteCond %{REQUEST_FILENAME} -f 
RewriteCond %{REQUEST_URI} (?i)(jpg|jpeg|png|gif)$ 
RewriteCond %{QUERY_STRING} h=([1-9]) [OR] 
RewriteCond %{QUERY_STRING} w=([1-9]) 
RewriteRule (.*) resize.php?src=%{REQUEST_URI}&%{QUERY_STRING}

我的 htaccess 和 resize.php 在同一个目录中。 和我的形象:

<img src="<?= make_image($row->imgage,750,422); ?>">

图像助手

function make_image($url, $w, $h){ 
  $str = parse_url($url);
  $exp = explode("/", $str["path"]);  
  $file = end($exp);
  $new_url = str_replace($url, 'https://www.example.com/public/tt/img/', $url);
  return $new_url . $file . '?h='.$h.'&w='.$w; 
}

目录:

结果: 如有任何建议,我会提出建议,谢谢。

【问题讨论】:

  • (?i) 背后的想法是什么?
  • 您如何确定它“不起作用”?你到底在期待什么?您发布的代码本身可以“工作”。尽管它确实有一些奇怪之处,并且可以进行一些优化。你还有其他指令吗?
  • @arkascha 这是一个正则表达式风格的不区分大小写的匹配(模式修饰符)。 (替代 mod_rewrite NC 标志。)
  • 我编辑了我的问题。谢谢你所有的答案。顺便说一句,对不起我的英语。

标签: php .htaccess url-rewriting


【解决方案1】:
RewriteCond %{REQUEST_FILENAME} -f 

条件检查请求的图像 URL 是否映射到物理文件。但是,根据您的文件系统图,/public/tt/img/&lt;filename&gt; 形式的任何请求都作为物理文件存在(没有/public/tt/img 目录),因此永远不会处理该规则。

您似乎需要否定此条件并检查请求是否已经映射到物理文件,而不是检查它是否映射?

为此,您需要在 CondPattern 前面加上 !。例如:

RewriteCond %{REQUEST_FILENAME} !-f 

【讨论】:

  • 感谢@MrWhite 的回答。我用RewriteCond %{REQUEST_FILENAME} !-f 替换了规则但是图像返回400个错误的请求响应
  • 这是旧的工作 htaccess RewriteCond $1 !^(resize\.php) RewriteRule ^(img)/(.*)-([0-9]{1,4})x([0-9]{1,4}).(jpg) resize.php?src=https://www.example.com/public/image/$2.$5&amp;w=$3&amp;h=$4 [L] 但我想使用多个图像文件夹。例如 /public/uploads/2020/ 当我在这个 htaccess 中添加第二行时,自然第 2 行不起作用。
  • 唯一显着的区别似乎是您传递给resize.php 脚本的查询字符串?我看不到 400 响应来自哪里?您已在更新后的指令中删除了 L 标志 - 如果您的 .htaccess 文件中有其他指令,您可能需要它。
  • 我的英语真的很差。我能理解你的意思,但我想我无法正确表达我的问题。对于那个很抱歉。我在上面评论过这个旧的 htaccess 工作正常。但我不能再使用它了。因为我有多个用于调用图像的目录。我在我的问题中使用 htaccess 并且您的答案有所改变。听起来不错,因为我认为我们走在正确的道路上。当我 var_dump($_GET) 在我的 resize.php 中返回 array(3) { ["src"]=&gt; string(47) "/public/tt/img/filename_16x9_1527.jpg" ["h"]=&gt; string(3) "422" ["w"]=&gt; string(3) "750" } 但我无法理解 400 错误请求。
【解决方案2】:

我解决了这个问题。我必须定义两种不同的模式。

RewriteEngine on
RewriteCond $1 !^(resize\.php)
RewriteRule ^(img)/(.*)-([0-9]{1,4})x([0-9]{1,4}).(jpg) resize.php?src=https://www.example.com/public/image/$2.$5&w=$3&h=$4 [L]
RewriteRule ^(uploads/(?:[0-9]{4}|members))/(.*)-([0-9]{1,4})x([0-9]{1,4}).(jpg) resize.php?src=https://www.example.com/public/$1/$2.$5&w=$3&h=$4 [L]

【讨论】:

  • 这里不需要RewriteCond 指令,因为声明了RewriteRule pattern
猜你喜欢
  • 1970-01-01
  • 2012-11-27
  • 1970-01-01
  • 2014-04-07
  • 1970-01-01
  • 2011-12-03
  • 1970-01-01
  • 2013-11-06
  • 1970-01-01
相关资源
最近更新 更多