我使用并且需要php_fpm7.0在 Debian 9 (stretch) apache 2.4.25 上。DocumentRoot 是/var/www/html并且运行良好。已启用 php、执行脚本等...现在我还想通过 apache dav_fs 模块将相同的树状结构用作文件系统。
去做这个 :
- /var/www/webdav是指向/var/www/html因此我可以在 apache 配置文件中使用两个不同的名称命名同一个目录,并根据访问名称创建两个不同的配置
- 我使用
/webdav
URL 访问 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 !
来阻止它们被传递