【问题标题】:htaccess jump to cached file (htaccess & php-Cache)htaccess 跳转到缓存文件(htaccess 和 php-Cache)
【发布时间】:2020-03-17 08:34:58
【问题描述】:

我有 php 处理的网页。当他们完成处理后,我得到一个 html 文件输出。该文件保存在名为“cache”的目录中。

例如

www.domain.tld/list.html (browser-url)
www.domain.tld/cache/list.html (cached-file)

我的实际问题是,我不知道如何更改 htaccess 文件来解决问题。

我如何应用 RewriteCond 将首先检查“/list.html”文件是否存在于该文件夹(缓存)中,然后(如果是):返回文件并(如果不)继续到另一个最终将重定向到 index.php 的条件。

但我需要遵守规则,它必须检查文件是否仍然存在(没有那个缓存文件夹)

这会导致错误:

RewriteCond cache/%{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php?/$1 [L,QSA]

这怎么可能?

某些页面的处理时间约为 20-30 秒或更长时间。这就是为什么我想在处理后保存它们,然后交付已经完成的站点以节省时间。

【问题讨论】:

  • REQUEST_FILENAME 可以包含 full 本地路径,如果此时已经确定的话 - 所以前缀 cache/ 不会导致任何位置在这种情况下有意义。请尝试在此处使用 REQUEST_URI,这是请求的 URL 路径,因此在本例中为 /list.html

标签: php .htaccess caching


【解决方案1】:

这应该满足你的要求:

RewriteEngine on

RewriteCond %{REQUEST_URI} ^/(.+)$
RewriteCond %{DOCUMENT_ROOT}/cache/%1 -f
RewriteRule ^ /cache/%1 [END]

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^/?(.*)$ index.php?/$1 [END]

如果您使用上述规则收到内部服务器错误(http 状态 500),那么您很可能操作的是非常旧版本的 apache http 服务器。在这种情况下,您将在 http 服务器错误日志文件中看到不支持的 [END] 标志的明确提示。您可以尝试升级或使用较旧的[L] 标志,在这种情况下它可能会起作用,尽管这取决于您的设置。

此实现同样适用于 http 服务器主机配置或动态配置文件(“.htaccess”文件)。显然重写模块需要在http服务器内部加载并在http主机中启用。如果您使用动态配置文件,您需要注意它的解释在主机配置中完全启用,并且它位于主机的 DOCUMENT_ROOT 文件夹中。

一般来说:您应该始终喜欢将此类规则放在 http 服务器主机配置中,而不是使用动态配置文件(“.htaccess”)。这些动态配置文件增加了复杂性,通常是意外行为的原因,难以调试,而且它们确实减慢了 http 服务器的速度。它们仅在您无法访问真正的 http 服务器主机配置(阅读:非常便宜的服务提供商)或坚持编写自己的规则的应用程序(这是一个明显的安全噩梦)的情况下作为最后一个选项提供。

【讨论】:

  • 非常感谢您的快速回复。我今天会试试的。顺便说一句:您提到您宁愿不使用 htaccess(动态 conf 文件)。你更喜欢什么? httpd.conf?
  • http 服务器的配置文件是配置整个服务器的中心文件,而不仅仅是文件系统中特定位置的一部分。它们通常沿着服务器本身安装到系统中,尽管您当然可以修改它们并将文件添加到该部分。通常它们位于/etc/apache2/.../etc/httpd/... 下,但这可能会有所不同。是的,“httpd.conf”文件可能在这些文件中,尽管该文件夹内容的命名和布局因您安装的软件包和您使用的系统发行版而异。
  • 我检查了我的 phpinfo 输出:_SERVER["DOCUMENT_ROOT"] 给了我“/home/trax/public_html”。在RewriteCond %{REQUEST_URI} ^/(.+)$ RewriteCond %{DOCUMENT_ROOT}/cache/%1 -f RewriteRule ^ /cache/%1 [END] 不起作用后,我将 [END] 更改为 [L,QSA]。这也没有用。所以我试图用%{DOCUMENT_ROOT}/trax_application/webpage/_trax/cache/%1 -f 替换我的文件中的%{DOCUMENT_ROOT}/cache/%1 -f。这不适用于 [END] 和 [L,QSA]。然后我将RewriteRule ^ /cache/%1 [END] 更改为RewriteRule ^ %{DOCUMENT_ROOT}/trax_application/webpage/_trax/cache_html/%1 [END]
  • 那么,/home/trax/public_html/cache/... 是否是缓存中文件的正确绝对路径?您的问题和评论都不清楚这一点......如果路径正确并且发布的规则集不起作用,那么其他东西就会关闭。请检查您的 http 服务器的错误文件...那里有任何提示吗?如果您在配置中放置明确的语法错误会发生什么,会导致错误日志文件中的条目吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-03-13
  • 1970-01-01
  • 1970-01-01
  • 2012-06-02
  • 2010-09-20
  • 2013-06-26
相关资源
最近更新 更多