Apache 和 php-fpm 不适用于带有正斜杠的脚本名称
2019-02-26
982
我将一个网站移至另一台服务器后,遇到了问题。旧网站未使用 php-fpm,新网站使用,到目前为止,我在迁移其他网站时没有遇到任何与此相关的问题。
这个网站的问题在于,它使用一种奇怪的方式来实现符号链接。看看 .htaccess 中发生了什么:
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php/$1 [L]
index.php 展开 PATH_INFO 以获取所需参数:
$url_elements = explode('/', $_SERVER['PATH_INFO']);
主页运行正常。所有子页面都无法正常工作。我在前端收到 File not found. ,在日志中收到来自 php-fpm 的 AH01071: Got error 'Primary script unknown\n' 。
我的想法是,发生这种情况是因为 php-fpm 获取了带有正斜杠的文件名并将其视为路径。
这是 Apache 用于通过 php-fpm 处理 PHP 文件的配置:
# Redirect to local php-fpm if mod_php is not available
<IfModule !mod_php7.c>
<IfModule proxy_fcgi_module>
# Enable http authorization headers
<IfModule setenvif_module>
SetEnvIfNoCase ^Authorization$ "(.+)" HTTP_AUTHORIZATION=$1
</IfModule>
<FilesMatch ".+\.ph(ar|p|tml)$">
SetHandler "proxy:unix:/run/php/php7.2-fpm.sock|fcgi://localhost"
</FilesMatch>
<FilesMatch ".+\.phps$">
# 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>
</IfModule>
</IfModule>
我无法重写此网站的代码以更好地制作友好 URL,因为此网站只是一个用于 SEO 目的的小页面,公司现在不允许在此上浪费时间。
如果有人能为我提供针对这些错误的简单修复方法,我会非常高兴。
提前谢谢您!
2个回答
请尝试启用
FollowSymLinks
和
AllowOverride All
<Directory /var/www/>
Options Indexes FollowSymLinks
AllowOverride All
Require all granted
</Directory>
完成后,使用命令
sudo systemctl stop apache2
&
sudo systemctl start apache2
Nabeel Javed
2019-12-17
我遇到了同样的问题,终于在投资了很多小时后,我发现了这个问题。
它通过此php.ini变量解决了:
086478683
我希望至少有帮助,以便其他人不会浪费太多时间。
iDanielBH
2023-05-02