来自deb.sury.org的 Debian libapache2-mod-php在用户目录中无法提供PHP文件

前端开发 2026-07-09

我用的开发机是Debian 13,安装的是由 https://deb.sury.org/ 提供的libmodapache2-php。

在系统升级到2026年 5月 15日后,user_dir里的PHP文件不再被提供服务。

原因是什么?

Apache错误日志如下:

[Fri May 22 14:46:37.007622 2026] [authz_core:error] [pid 22706:tid 22706] [client 10.0.2.2:64798] AH01630: client denied by server configuration: /home/caiofior/public_html/abbrevia/index.php

解决方案

请检查文件 /etc/apache2/mods-enabled/userdir.conf

<IfModule mod_userdir.c>
    UserDir public_html
    UserDir disabled root

    <Directory /home/*/public_html>
                php_admin_value engine On
        php_admin_flag short_open_tag On
        php_admin_flag display_error On
        php_admin_flag display_startup_errors On
        php_admin_value error_reporting -1
        AllowOverride All
        Options MultiViews Indexes SymLinksIfOwnerMatch IncludesNoExec
        Require method GET POST OPTIONS PUT DELETE
    </Directory>
</IfModule>

# vim: syntax=apache ts=4 sw=4 sts=4 sr noet

大致应该是这样的,关键的部分是

php_admin_value engine On

然后检查文件cat /etc/apache2/mods-enabled/php*.conf

# Using (?:pattern) instead of (pattern) is a small optimization that
# avoid capturing the matching pattern (as $1) which isn't used here
<FilesMatch "\.ph(?:ar|p|tml)$">
    SetHandler application/x-httpd-php
</FilesMatch>
<FilesMatch "\.phps$">
    SetHandler application/x-httpd-php-source
    # Deny access to raw php sources by default
    # To re-enable it's recommended to enable access to the files
    # only in specific virtual host or directory
    Require all denied
</FilesMatch>
# Deny access to files without filename (e.g. '.php')
<FilesMatch "^\.ph(?:ar|p|ps|tml)$">
    Require all denied
</FilesMatch>

# Running PHP scripts in user directories is disabled by default
# 
# To re-enable PHP in user directories comment the following lines
# (from <IfModule ...> to </IfModule>.) Do NOT set it to On as it
# prevents .htaccess files from disabling it. This also disables
# serving the files, as the webserver would otherwise serve them
# as plaintext, and many software packages still put passwords in
# .php files. Comment out or remove the FilesMatch directive if
# you really want to serve php as plaintext from user dirs.
<IfModule mod_userdir.c>
    <Directory /home/*/public_html>
        php_admin_flag engine Off
        <FilesMatch "\.ph(ar|p|ps|tml)$">
            Require all denied
        </FilesMatch>
    </Directory>
</IfModule>

如果是这样,请把最后一条指令中的php_admin_flag engine Off注释掉。

我记得在上次更新之前,这条指令并不存在。

我猜这和这次合并有关。

https://salsa.debian.org/php-team/php/-/merge_requests/17

站内所有文章版权归属LeftHeroAI导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。

相关文章