我正在尝试使用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
规则适用于所有其他文件扩展名。我究竟做错了什么?提前谢谢!
答案 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 必须检查磁盘是否存在文件,但我推测几乎在所有情况下差异都可以忽略不计。