Apache 后备资源配置
Apache FallbackResource Configuration
我正在尝试使用 Apache Web 服务器 (v2.4) 将 PHP 应用程序从 Windows IIS 移植到 Linux (Debian)。我成功地将我的文档根更改为 /code/wwwroot
,并使用配置文件 /etc/apache2/sites-available/000-default.conf
而不是 .htaccess
进行配置(在 Apache 2.4 文档中它说使用 /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/
中找到的文件时,将提供这些文件。如果请求的file/path不存在,则start.php
为运行并返回。例如,如果我的请求是 localhost/gadgasd.html
,等等,它会在内部重定向到 start.php
。但是,对于文档根目录中不存在的具有 .php
扩展名的文件,我收到 404。例如,如果请求是 localhost/gadgasd.php
,我会直接从 Apache 获得 404(我希望在我的代码中而不是 Apache 中处理 404)。此行为严格限于文档根目录中不存在的具有 .php
扩展名的文件。我对这种行为感到很困惑。我已经设置了正确的包以将 php 与 apache (apt-get install -y php libapache2-mod-php
) 一起使用,并且 FallbackResource
规则适用于所有其他文件扩展名。我究竟做错了什么?提前致谢!
这似乎是 Apache 中的一个错误,并且有一个未解决的问题跟踪器 here。还提供了一个解决方法。
编辑: 如果 link 死掉,解决方法是使用旧的 mod_rewrite
方法,如下所示:
RewriteEngine On
RewriteCond /var/www/%{REQUEST_FILENAME} !-f
RewriteCond /var/www/%{REQUEST_FILENAME} !-d
RewriteRule (.*) start.php
问题是因为默认 mod_php 配置 (/etc/apache2/mods-enabled/phpX.conf
) 在将请求传递给 PHP 处理程序之前似乎没有检查文件是否存在。这可以通过更改轻松添加:
<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
和 .phar
结尾的请求都是盲目地传递给 php 处理程序。
值得注意的是,这可能会对性能产生影响,因为 Apache 必须检查磁盘是否存在文件,但我推测几乎在所有情况下差异都可以忽略不计。
我正在尝试使用 Apache Web 服务器 (v2.4) 将 PHP 应用程序从 Windows IIS 移植到 Linux (Debian)。我成功地将我的文档根更改为 /code/wwwroot
,并使用配置文件 /etc/apache2/sites-available/000-default.conf
而不是 .htaccess
进行配置(在 Apache 2.4 文档中它说使用 /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/
中找到的文件时,将提供这些文件。如果请求的file/path不存在,则start.php
为运行并返回。例如,如果我的请求是 localhost/gadgasd.html
,等等,它会在内部重定向到 start.php
。但是,对于文档根目录中不存在的具有 .php
扩展名的文件,我收到 404。例如,如果请求是 localhost/gadgasd.php
,我会直接从 Apache 获得 404(我希望在我的代码中而不是 Apache 中处理 404)。此行为严格限于文档根目录中不存在的具有 .php
扩展名的文件。我对这种行为感到很困惑。我已经设置了正确的包以将 php 与 apache (apt-get install -y php libapache2-mod-php
) 一起使用,并且 FallbackResource
规则适用于所有其他文件扩展名。我究竟做错了什么?提前致谢!
这似乎是 Apache 中的一个错误,并且有一个未解决的问题跟踪器 here。还提供了一个解决方法。
编辑: 如果 link 死掉,解决方法是使用旧的 mod_rewrite
方法,如下所示:
RewriteEngine On
RewriteCond /var/www/%{REQUEST_FILENAME} !-f
RewriteCond /var/www/%{REQUEST_FILENAME} !-d
RewriteRule (.*) start.php
问题是因为默认 mod_php 配置 (/etc/apache2/mods-enabled/phpX.conf
) 在将请求传递给 PHP 处理程序之前似乎没有检查文件是否存在。这可以通过更改轻松添加:
<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
和 .phar
结尾的请求都是盲目地传递给 php 处理程序。
值得注意的是,这可能会对性能产生影响,因为 Apache 必须检查磁盘是否存在文件,但我推测几乎在所有情况下差异都可以忽略不计。