问题描述
我正在处理在 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