如何阻止 apache 在给定目录中运行 PHP?

如何阻止 apache 在给定目录中运行 PHP?

我使用并且需要php_fpm7.0在 Debian 9 (stretch) apache 2.4.25 上。DocumentRoot 是/var/www/html并且运行良好。已启用 php、执行脚本等...现在我还想通过 apache dav_fs 模块将相同的树状结构用作文件系统。

去做这个 :

  1. /var/www/webdav是指向/var/www/html因此我可以在 apache 配置文件中使用两个不同的名称命名同一个目录,并根据访问名称创建两个不同的配置
  2. 我使用/webdavURL 访问 webdav。在 apache 配置中,/webdav有一个指向的别名/var/www/webdav。现在我只需要设置<Directory /var/www/webdav>部分,一切都应该很好。

到目前为止,它几乎可以正常工作:我可以使用 webdav 获取和放置文件、创建目录、重命名文件等...但当我通过 webdav 别名获取 PHP 文件时,它们会继续执行。因此,如果我想编辑 .php 文件,我确实会在编辑器中得到脚本的结果,这是没用的。

我目前的设置:

<VirtualHost *:80>
    ServerAdmin webmaster@localhost
    DocumentRoot /var/www/html

    ErrorLog ${APACHE_LOG_DIR}/error.log
    CustomLog ${APACHE_LOG_DIR}/access.log combined

    <Directory /var/www/html>
        AllowOverride All
        require all granted
        Options Indexes FollowSymLinks MultiViews
    </Directory>

    Alias /webdav /var/www/webdav
    <Directory /var/www/webdav>
        SetHandler none
        Options -ExecCGI -FollowSymLinks -Includes -Indexes -MultiViews
        AddType text/plain php php3 php4 php5 php7 php8 pht phptml phps
        AllowOverride None
        DAV On
        <ifmodule mod_dir.c>
            DirectoryIndex disabled
        </ifmodule>
        <ifmodule mod_rewrite.c>
            RewriteEngine Off
        </ifmodule>
        <Files ~ "^\.ht"> # need to be able to edit .htaccess files.
            require all granted
        </Files>
    </Directory>
</VirtualHost>

防止 php 在 /var/www/webdav 目录中执行的正确方法是什么?

编辑和解决方案

由于 Debian 使用SetHandler "proxy:unix:/run/php/php7.0-fpm.sock|fcgi://localhost" /etc/apache2/conf-available/php7.0-fpm.conf,我必须使用SetHandler none。但在<Directory>部分中,这太晚了。它必须在中使用<Location>,这解释得足够早。我还ProxyPass !按照@exussum的建议包含了它(应该放在<Location>?中)。在这个确切的情况下它是无用的,但无论如何,代理在这里肯定是不需要的。

还请注意,我必须将身份验证/授权放在 中<Directory>。它在 中有效<Location>,但只有 CLI cadaver 客户端可以访问 webdav 集合。当身份验证/授权在 中时<Directory>,nautilus 文件管理器可以访问文件。

<VirtualHost *:80>
    ServerAdmin webmaster@localhost
    DocumentRoot /var/www/html

    ErrorLog ${APACHE_LOG_DIR}/error.log
    CustomLog ${APACHE_LOG_DIR}/access.log combined

    <Directory /var/www/html>
        AllowOverride All
        require all granted
        Options Indexes FollowSymLinks MultiViews
    </Directory>

    Alias /webdav /var/www/webdav
    <Location /webdav>
        <IfModule mod_proxy.c>
            ProxyPass !
        </IfModule>
        SetHandler none
        AddType text/plain php php3 php4 php5 php7 php8 pht phptml phps
    </Location>
    <Directory /var/www/webdav>
        AuthName "Restricted Area"
        AuthType Basic
        AuthUserFile    "/etc/apache2/user-password"
        require valid-user
        Options -ExecCGI -FollowSymLinks -Includes -Indexes -MultiViews
        AllowOverride None
        DAV On
        <ifmodule mod_dir.c>
            DirectoryIndex disabled
        </ifmodule>
        <ifmodule mod_rewrite.c>
            RewriteEngine Off
        </ifmodule>
        <Files ~ "^\.ht"> # need to be able to edit .htaccess files.
            require all granted
        </Files>
    </Directory>
</VirtualHost>

答案1

由于您使用的是 fpm,因此您需要在某个时候将请求发送到 FPM

通常是这样的

ProxyPassMatch ^/(.*\.php(/.*)?)$ unix:/path/to/socket.sock

或类似方法。(见https://wiki.apache.org/httpd/PHP-FPM(其他选项)

您需要文件不碰到这个,使用目录块ProxyPass !来阻止它们被传递

相关内容