【问题标题】:fatal .htaccess error [closed]致命的.htaccess错误[关闭]
【发布时间】:2012-12-09 10:33:58
【问题描述】:

我有一个上传照片的目录,按日期排序,如下所示:

http://mysite.com/uploads/2012-12-08/abcd.png

我在我的/uploads/ 文件夹中创建了一个index.php 和一个.htaccess

我可以使用index.php 来控制图像width & height

原始网址如下所示:http://mysite.com/uploads/?url=2012-12-08/abcd.png&width=128

这是.htaccess 代码:

<IfModule mod_rewrite.c>
  RewriteEngine On
  RewriteCond %{REQUEST_FILENAME} !-f
  RewriteRule ^(.*) /uploads/index.php?url=$1 [QSA]
</IfModule>

如果我输入网址:http://mysite.com/uploads/2012-12-08/abcd.png&amp;width=128 将出现调整大小的图像

但问题是浏览器将图像扩展名显示为png&amp;width=128

图片网址也不能在某些论坛显示,因为&符号

如何将.png&amp;width=128 更改为.png?width=128?

还有不止两个查询字符串

最大值:?url=$&width=$&height=$&rotate=$&filter=$&

我已经尝试了以下规则:

RewriteCond %{QUERY_STRING} (.+)
RewriteRule ^(.*)$ /uploads/index.php?url=$1&%1 [QSA]

但显示 http 错误 500

我尝试了很多规则,但没有一个有效..

请帮忙!

【问题讨论】:

    标签: php .htaccess directory rewrite


    【解决方案1】:

    这不是将 url 更改为不同模式的问题。你采取了错误的方法。现代浏览器在保存某些下载的对象时会建议一个文件名。该文件名建议基于请求下载时交付服务器指定的标头。标头带有一些额外的元信息,描述发送到浏览器的实际内容是什么。

    只有在无法从收到的标头中提取可用信息时,浏览器才会使用 url 模式来建议文件名。

    因此,您要做的是发送适当的标头,然后每个浏览器都会使用建议的名称。如果你用谷歌搜索的话,有很多关于这个的条目。作为起点,在您的 index.php 脚本中发送实际图像之前使用它:

    <?php
    // the mime type of the object, replace 'image/png' dynamically as required
    header('Content-Type: image/png');
    // the suggested file name, obviously you can dynamically replace 'image.png'
    header('Content-Disposition: Attachment;filename=image.png'); 
    // NOW send the content (the image)
    ?>
    

    作为替代方案,您可以使用不同的处置方式。 'Attachment' 强制下载图像,'inline' 建议内联显示而不是下载。这只有在对象的 mime 类型实际上可以内联显示时才有效:

    <?php
    // the mime type of the object, replace 'image/png' dynamically as required
    header('Content-Type: image/png');
    // the suggested file name, obviously you can dynamically replace 'image.png'
    header('Content-Disposition: inline;filename=image.png'); 
    // NOW send the content (the image)
    ?>
    

    无论你做什么,了解这些东西是如何工作的以及你有什么选择和替代方案肯定是有意义的。这是真正了解正在发生的事情的唯一方法,这是实现代码时最重要的事情之一。我建议你从阅读 phps header() 函数开始。

    【讨论】:

    • 我添加了这段代码,但是浏览器自动下载了图片,有什么解决办法吗?
    • 我以为这就是你想要的。 “附件”用于强制下载。如果你想显示图像而不是更改标题以使用“内联”而不是“附件”,如第二个示例所示。
    • 但是如果我第一次使用附件加载图像会在浏览器中显示不下载,扩展仍然.png&width=xxx.需要刷新页面才能开始下载...
    • 您必须刷新浏览器可能是一种缓存效果,对此您无法更改。仅当您之前曾请求过一次网址时才会发生这种情况。
    • 不,我改变了宽度一样...但是真的没有像 xxx.jpg?width=123 这样的 url 成功吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-06-25
    • 1970-01-01
    • 2023-01-06
    • 1970-01-01
    • 2011-10-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多