【问题标题】:Apache, on 404 from mod_rewrite, check file system for fileApache,来自 mod_rewrite 的 404,检查文件系统中的文件
【发布时间】:2013-11-08 01:41:40
【问题描述】:

目前,我正在迁移一个站点,由于时间限制,我们已将大部分迁移到 CMS (Drupal),但仍有一些平面 HTML 子站点需要在此之外提供服务。

现在,配置方面,我已经设置 Apache 来传递对确实存在并直接获得服务的文件的请求,而不是将请求发送到 CMS:

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^ index.php [L]

随着我们获得更多时间,团队希望慢慢从文件系统中导入我们在 CMS 中遗漏的页面,但我们无法轻松地从文件系统中删除这些额外文件我们已将它们导入 Drupal(很遗憾,服务提供商部署方法 - 所以不可更改)。

我们使用与旧网站相同的 URL(保留旧链接/地址等),因此,一旦我们在 CMS 中重新创建了页面,上述重写规则仍会从文件系统。

我想解决这个问题,是使用 mod_rewrite 通过 Drupal 路由所有请求,然后如果 Drupal 抛出 404,尝试从文件系统中提取 URL,而不是我们当前拥有的 URL,即如果该文件存在,自动提供。从一天左右的搜索开始,我找不到实现这一目标的方法,甚至找不到很多人实际上遇到过这个问题。

当然,如果我可以完全控制我们的环境,那么一旦底层文件被迁移就可以很容易地删除它们,但在这种情况下就不是那么简单了。

我也明白这样做会产生开销,但鉴于这仅适用于网站的一小部分,我将评估任何解决方案,看看它是否是可接受的折衷方案。

有什么想法吗?

【问题讨论】:

  • 这可能无关紧要,但这是 d6 还是 7?还有这些静态文件是什么?它们是单个 html 文件还是更复杂的微型站点?有很多吗?
  • 您的需求还不够详细。
  • @Andrew 这是 D7,这些文件都是它所提供的单个 HTML 文件,有些使用 SSI,但这很复杂。
  • @jacouh,你不明白哪一部分?如果您让我知道要扩展的部分,我会更详细地解释它。我正在寻找一个基于 Apache 的解决方案,该解决方案允许我首先将所有流量路由到 Drupal,然后当抛出 404 时,Apache 尝试在文件系统上查找文件,如果找到则提供它,否则显示 404最终用户。我玩过 Apache 的 ErrorDocument,但没有取得多大成功。
  • 我认为 ErrorDocument 指向一个 PHP 脚本,然后检查文件是否存在将是最有效的选择。

标签: apache mod-rewrite drupal


【解决方案1】:

您能否添加一个 RewriteCond,它会在您检查特定路径并将它们直接发送到 index.php 之前启动?

有点像

RewriteRule ^/some/path/to/file.html$ index.php [L]

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^ index.php [L]

如果你有很多不同的路径可能会有点笨拙,如果你现有的静态文件有一个很好的正则表达式模式会更好

【讨论】:

  • 不幸的是,有很多路径。这也不太奏效(我在这个过程的早期尝试了一个变体),因为一旦它被发送到 Drupal,Drupal 然后抛出一个 404,除了使用 ErrorDocument,我无法让 Apache 处理那个 404。
  • 好的,所以静态页面的 drupalized 版本的路径不完全对应?否则我不明白为什么 drupal 会抛出 404
猜你喜欢
  • 2014-05-25
  • 2012-08-16
  • 1970-01-01
  • 2014-08-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-25
  • 1970-01-01
相关资源
最近更新 更多