在 processwire 设置中,您如何在没有 404 错误的情况下加载自定义的与 processwire 无关的 PHP 文件?需要进行哪些 .htaccess 编辑?

问题描述

我正在处理在 Processwire 上运行的客户端网站。我正在尝试建立一个常规的 ol' PHP 页面任何流程线内容之外的 PHP 页面可以像提供的普通 PHP 页面一样执行。

假设我试图在根页面“bar.PHP”具有以下代码的地方设置“/foo/bar.PHP”:

foo/bar.PHP

<?PHP

    echo "Hello World";

?>

大概,如果我访问了 example.com/foo/bar.PHP,服务器会看到该资源存在并通过在浏览器中向用户显示“Hello World”来提供内容。但是,我收到了一个 404 错误,将我带到了 PW 404 页面

在根目录的 .htaccess 文件中,我看到了:

  # -----------------------------------------------------------------------------------------------
  # 17. If the request is for a file or directory that physically exists on the server,# then don't give control to ProcessWire,and instead load the file
  # -----------------------------------------------------------------------------------------------

  RewriteCond %{REQUEST_FILENAME} !-f
  RewriteCond %{REQUEST_FILENAME} !-d
  RewriteCond %{REQUEST_FILENAME} !(favicon\.ico|robots\.txt)

我一定不能正确理解这一点,因为实际的 bar.PHP 文件确实存在……但它不起作用。但是,如果我将 bar.PHP 的扩展名更改为 bar.txt 文件 example.com/foo/bar.txt 加载显示如上所示的 PHP 代码)。

那么,如何调整或更新 .htaccess 以告诉 PW 忽略 /foo 下的任何内容包括递归的文件文件夹),以免被 PW 处理?

解决方法

你不应该做任何事情。正如您所建议的,这些指令(尽管不完整且不严格正确)应该已经排除了对任何 物理文件(和目录)的请求。更有可能的问题是您的服务器上如何处理/处理 PHP 文件(CGI/反向代理?!),然后文件系统检查由于某种原因失败。

作为一种解决方法,您可以为这个为您的 PHP 文件提供服务的子目录添加一个特定的例外。这可以通过几种方式实现...例如:

  • 首先在您发布的条件列表中包含另一个条件

    RewriteCond %{REQUEST_URI} !^/foo/
    

  • .htaccess 文件的顶部包含一个异常,以防止在请求此目录时(或者更确切地说,当以 /foo/ 开头的 URL 路径为请求)。

    RewriteRule ^foo(/|$) - [L]
    

  • 在子目录 .htaccess 中创建另一个 /foo 以禁用(或启用)重写引擎。默认情况下不会继承 mod_rewrite 指令,因此这会完全覆盖父 .htaccess 文件中的 mod_rewrite 指令。

    RewriteEngine Off