X-Sendfile显示404处理程序文件

时间:2017-07-14 00:48:08

标签: php apache .htaccess mod-rewrite x-sendfile

我试图通过一些有创意的.htaccess重写来通过X-Sendfile提供文件。将它归结为最基本的要素,我基本上捕获任何传入的请求并将其路由到处理程序文件,就像这样......

的.htaccess

# If the requested file exists...
RewriteCond %{REQUEST_FILENAME} -f
# Send the request to handler.php instead
RewriteRule . /handler.php [L]

这是 handler.php

<?php
header( 'Content-Type: text/html' );
header( "X-My-Debug: {$_SERVER['REQUEST_URI']}" );
header( "X-Sendfile: {$_SERVER['REQUEST_URI']}" );
die();

现在,理想情况下,如果我请求现有文件,例如localhost/helloworld.htm,我应该在浏览器中看到helloworld.htm的内容。相反,我看到了:

未找到:在此服务器上找不到请求的网址/handler.php。

奇怪,请求被路由到处理程序,但这不是发送到X-Sendfile的文件名。此外,响应中缺少我的自定义调试头。所以当然,我要做的第一件事是尝试使用处理程序......

<?php
header( 'Content-Type: text/html' );
header( "X-My-Debug: {$_SERVER['REQUEST_URI']}" );
header( "X-Sendfile: helloworld.htm" );
die();

如果我这样做,那么localhost/helloworld.html仍然会出现上述错误... 然而,当我现在直接访问localhost/handler.php时,它最终确实为我服务了编码helloworld.htm内容,我的调试标头现在出现在响应中。无论是否用相对路径或绝对路径替换硬编码文件,结果都是相同的。

那我在这里错过了什么?当我重写请求时,为什么X-Sendfile在HANDLER文件中给出了404错误,但是当我直接访问处理程序时却没有?为什么我的自定义调试头会丢失?

为了记录,我通过MAMP 4.1.1运行它。

1 个答案:

答案 0 :(得分:0)

当路径正确时,X-Sendfile将提供404 NOT FOUND错误页面,但该文件没有足够的读/写/执行权限。尝试将您的文件chmod为0644并再次尝试查看它是否解决了问题。