Cuando se solicita un script php inexistente, mod_proxy_fcgi proporciona un mensaje de error bastante inútil, que básicamente simplemente dice
[proxy_fcgi:error] .... AH01071: Got error 'Primary script unknown\n'
Este servidor utiliza Apache 2.4.6 (Centos 7), con el manejo de php configurado como:
<FilesMatch \.php$>
SetHandler "proxy:fcgi://127.0.0.1:9000"
</FilesMatch>
Realmente me gustaría saber el nombre real del script, porque puede contener información útil (como indicar un enlace defectuoso, un error en el nombre de una página o simplemente mostrar que es simplemente otro tonto que busca un servidor con wp-login desprotegido). .php).
Intenté cambiar LogLevel de información a depuración, pero luego el registro de errores también se llenó con detalles válidos de acceso al script php, lo que complica bastante el registro de errores, ya que en realidad no son errores.
¿Hay alguna manera de obtener un mensaje de error proxy_fcgi más útil que incluya el nombre real del script para scripts php inexistentes?
Respuesta1
Puede definir ErrorLogFormat incluyendo %L y luego hacer lo mismo en su formato CustomLog %L
Eso hará que Apache registre una identificación específica que vinculará una entrada del registro de errores a la entrada del registro de acceso y luego todo lo que necesita hacer es grep.
Ejemplo:
ErrorLogFormat "[%{u}t] [%-m:%l] [%L] [pid %P:tid %T] %7F: %E: [client\ %a] %M% ,\ referer\ %{Referer}i"
LogFormat "%h %l %u [%L] %t \"%r\" %>s \"%{Referer}i\" \"%{User-Agent}i\"" combined
Entonces, la próxima vez, cuando vea un error, verifique el ID que contiene y busque el archivo access.log para obtener el mismo ID.
Respuesta2
Obtendría la hora del error registrado y luego buscaría en el registro de acceso alrededor de esa hora las solicitudes que devolvieran un error. Eso debería ayudar a localizar el guión.
Respuesta3
El error en cuestión proviene de la aplicación FastCGI (lo que sea que esté escuchando en el puerto 9000), no de Apache. Apache simplemente informa lo que regresa en la FCGI_STDERR
transmisión FastCGI.
Si Apache está hablando con PHP-FPM (como parece probable), puede consultar los registros de PHP-FPM. Puede consultar la error_log
directiva en su php-fpm.conf
archivo para averiguar dónde PHP-FPM registra errores. Debería haber más pistas allí.
Respuesta4
Una solución es comprobar si el archivo existe antes de pasarlo al controlador, que es lo que hace la configuración predeterminada de Debian.archivo de configuraciónsugiere.
<FilesMatch ".+\.ph(ar|p|tml)$">
<If "-f %{REQUEST_FILENAME}">
SetHandler "proxy:unix:/run/php/php-fpm.sock|fcgi://localhost"
</If>
</FilesMatch>
De esa manera, si el archivo no existe, Apache lo manejará, en lugar de PHP.