Apache FallbackResource配置

时间:2018-05-20 22:27:32

标签: php linux apache php-7 apache2.4

我正在尝试使用Apache Web服务器(v2.4)将PHP应用程序从Windows IIS移植到Linux(Debian)。我成功地将文档根目录更改为/code/wwwroot,并使用配置文件/etc/apache2/sites-available/000-default.conf代替.htaccess进行配置(在Apache 2.4文档中,它说使用{{1}中的配置文件1}}如果你有权访问服务器配置文件,我这样做。这就是我用于配置的内容:

/etc/apache2/sites-available

这几乎完全符合我的预期。当请求 <VirtualHost *:80> ServerAdmin webmaster@localhost DocumentRoot /code/wwwroot <Directory /code/wwwroot> Options Indexes FollowSymLinks AllowOverride None FallbackResource /start.php </Directory> CustomLog ${APACHE_LOG_DIR}/access.log combined </VirtualHost> 中找到的文件时,会提供这些文件。如果请求的文件/路径不存在,则运行并返回/code/wwwroot/。例如,如果我的请求是start.php等,则会在内部重定向到localhost/gadgasd.html。但是,对于文档根目录中不存在start.php扩展名的文件,我将获得404。例如,如果请求是.php,我直接从Apache获得404(我希望在我的代码而不是Apache中处理404)。此行为严格限于文档根目录中不存在localhost/gadgasd.php扩展名的文件。我对这种行为非常困惑。我已经设置了正确的包使用php和apache(.php),apt-get install -y php libapache2-mod-php规则适用于所有其他文件扩展名。我究竟做错了什么?提前谢谢!

2 个答案:

答案 0 :(得分:0)

这似乎是Apache中的一个错误,并且有一个开放的问题跟踪器here。还提供了一种解决方法。

编辑:如果链接死亡,解决方法是使用旧的mod_rewrite方法,如下所示:

RewriteEngine On
RewriteCond /var/www/%{REQUEST_FILENAME} !-f
RewriteCond /var/www/%{REQUEST_FILENAME} !-d
RewriteRule (.*) start.php

答案 1 :(得分:0)

问题来自这样一个事实,即默认的 mod_php 配置 (CustomPaint) 在将请求传递给 PHP 处理程序之前似乎没有检查文件是否存在。这可以通过更改轻松添加:

/etc/apache2/mods-enabled/phpX.conf

<FilesMatch ".+\.ph(ar|p|tml)$">
    SetHandler application/x-httpd-php
</FilesMatch>

<FilesMatch ".+\.ph(ar|p|tml)$"> <If "-f %{REQUEST_FILENAME}"> SetHandler application/x-httpd-php </If> </FilesMatch> 似乎没有像您预期的那样检查文件是否存在,这意味着所有以 <FilesMatch/>.php.phtml 结尾的请求都被盲目传递到 php 处理程序。

值得注意的是,这可能会对性能产生影响,因为 Apache 必须检查磁盘是否存在文件,但我推测几乎在所有情况下差异都可以忽略不计。