【问题标题】:May I use mod_rewrite with urlencode?我可以将 mod_rewrite 与 urlencode 一起使用吗?
【发布时间】:2014-06-10 14:42:49
【问题描述】:

我在 PHP Web 系统中使用 mod_rewrite,我的 .htaccess 中有这个重写规则

RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.+).(pdf)$  /static/data/biblioteca/$1.$2 [L]

这让我可以写作

<a href="http://my_domain.net/some_file.pdf" target="_new">title_of_some_file</a>

并在新的浏览器窗口中直接打开 PDF 文件,这样可以在看到源页面时隐藏我的目录结构。

这很好用,但有一个原因。我住在巴西,葡萄牙语有符号“á”、“é”、“ã”、“õ”,大多数可用书籍的标题都有这些符号。

当我使用 urlencode 获取正确的文件名时,似乎 mod_rewirte 会感到困惑,因为它会重定向文件但我收到错误 404!

我知道我可能会放弃符号,将“ã”替换为“a”等等,但我不想这样做,因为可能会出现一些令人尴尬的错误。例如,在葡萄牙语中,“côco”表示椰子,“cocô”表示粪便。如果我将“ô”替换为“o”,这两个词的写法将相同,并且会出现所有可能的(和令人作呕的)含义扭曲。

【问题讨论】:

  • Apache 为您解码查询字符串。另见:stackoverflow.com/q/459667/362536
  • 顺便说一句:“伪装我的目录结构的优势...” - 可以通过该公共 URL 访问该文件,谁在乎目录结构是什么样的?
  • 也许我是个傻瓜,@deceze,因为我只是不喜欢人们查看我所有的目录结构。我总是使用 mod_rewrite 来避免这种情况。此外,它缩短了我的网址。当然,该页面的目标是向网站用户提供某些 PDF 书籍。正如我之前所说,也许我只是有点傻。 :)
  • 你用什么系统?我刚刚测试过,它在我的 Ubuntu/Linux 操作系统上运行良好
  • 谢谢@Brad,我会看到这篇文章的。

标签: php apache .htaccess mod-rewrite urlencode


【解决方案1】:

正如我在 cmets 中所说,我刚刚进行了测试,它在我的 Ubuntu/Linux 操作系统上运行良好。所以看起来是文本编码问题。

尝试使用[NE](无转义)标志

RewriteRule ^(.+).(pdf)$  /static/data/biblioteca/$1.$2 [L,NE]

如果这没有帮助,也许你可以考虑使用一些 PHP

.htaccess:

RewriteRule ^(.+).(pdf)$  /readpdf.php?name=$1 # (example)

PHP部分:

<?php

$filename = $_GET['name'];

// you may need to make sure there is no security flaws (like .. in name etc.)
// you may also need to convert encoding (from utf to iso for MS Windows)

$filepath = "static/data/biblioteca/" . $filename;
readfile($filepath . ".pdf");

【讨论】:

  • 这个 PHP 解决方案完全符合我的需要。谢谢@Peter!
猜你喜欢
  • 2023-03-25
  • 2020-08-04
  • 2018-10-23
  • 2011-02-22
  • 2021-03-16
  • 2016-11-20
  • 2019-01-25
  • 2011-06-11
  • 2017-02-20
相关资源
最近更新 更多