【问题标题】:Apache Alias "Best guess" filenameApache 别名“最佳猜测”文件名
【发布时间】:2011-08-17 10:56:46
【问题描述】:

使用 Apache 和 mod_rewrite 我可以将一个复杂的请求重写为一个简单的文件名,例如:

RewriteRule ^shortcut/(.*)$ /long/way/around/$1

这可以反过来工作吗?我想要一个简单的请求被重写到一个未知的文件,但我可以确定哪个文件应该由一个唯一的 ID 号提供服务,该 ID 号前缀为它的文件名。我希望 Apache 使用正则表达式“猜测”根据 ID 提供哪个文件。

例如:

GET /img/29281.jpg

Directory of /img/:
...
29280-filename-here.jpg
29281-other-filename-here.jpg  <-- Apache should serve this one
29282-more-files-here.jpg
...

因此,正则表达式重写可能是:

^(\d+)\.jpg$   -->   ^$1\-[a-zA-Z0-9-_]+.jpg$

如何将它集成到 Apache 中(如果可能的话)?

非常感谢您的任何建议。

附:在这种情况下,不能将所有文件名重命名为简单的 ID 号。

【问题讨论】:

  • 任何有经验的用户:你觉得这个问题放在另一个网站上会更好吗(想到stackoverflow)?它相当繁重,可能存在于那里?如果是这样,正确交叉发布的程序是什么?
  • @Ellipsis - 我同意 StackOverflow 是这个问题的最佳目的地,我现在把它移到那里;以后,请使用“标记”+“需要版主关注”控件来加快关注您的请求。
  • 我认为最好的策略是将^(\d+)\.jpg$ 重定向到一个脚本(例如,PHP)并在那里实现“最佳猜测”。

标签: apache mod-rewrite


【解决方案1】:

我认为 apache 方式之一是使用带有 RewriteMap 指令的 mod-rewrite,并使用 rewritemap 的 :prg 映射。

这将在 apache 启动一个简单程序时加载(可能是文档中建议的 perl 程序,PHP 程序可能会遇到更多的内存泄漏和性能问题,恕我直言)。这个程序将不得不做文件名猜测的最后一部分。

您可以找到一些此类程序的示例here (PHP)there (C)and here a Perl basic one

我的大脑中启用 perl 的能力还不够,无法使用 perl 方法来提取带扩展名和 int 标识符的真实文件名,但这应该简单而简短(这对于 PRG rewriteMap 很重要)。

【讨论】:

  • 听起来Apache没有这个内置的,所以这看起来是最强大的方法;尽管 Creadiff 的 404 解决方案是一个很好的解决方案。
【解决方案2】:

您可以使用 PHP 脚本作为 404 页面的 ErrorDocument。 该脚本将找到所需的文件,并将重定向发送到所需的文件。

【讨论】:

    猜你喜欢
    • 2014-12-25
    • 2016-05-07
    • 1970-01-01
    • 2012-12-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-05
    相关资源
    最近更新 更多