Apache - Halaman kesalahan khusus menampilkan kesalahan AH01071 hanya untuk permintaan file

Sep 11 2019

Saya memiliki situs yang dihosting dengan penyedia hosting bersama. Ini adalah Apache dengan FPM / FastCGI dan PHP 7.2

Menjadi shared hosting, satu-satunya konfigurasi yang saya akses adalah htaccess, tetapi jelas bukan file conf Apache.

Saya memiliki halaman kesalahan kustom dikonfigurasi di htaccess saya seperti ini: ErrorDocument 404 /error404.php. Hari ini saya melihat bahwa halaman kesalahan 404 tersuai saya tidak ditampilkan. Sebaliknya teks biasa File not found.dikembalikan ke browser dengan kode status 404 di header. Penyelidikan lebih lanjut mengungkapkan bahwa ini hanya terjadi jika permintaan adalah untuk sebuah file . Jika Anda meminta direktori yang tidak ada , maka Anda mendapatkan halaman kesalahan kustom! Misalnya, meminta mydomain.info/dummy.htmmemberikan kesalahan tetapi meminta mydomain.info/dummy/mengembalikan halaman kesalahan kustom.

Server mencatat kesalahan AH01071yang Primary script unknownuntuk setiap File not found.kesalahan.

Tampaknya ModSecurity diaktifkan di server karena log merekam permintaan berbahaya yang ditolak, mis [client xxx.xxx.xxx.xxx] ModSecurity: Access denied with code 403 (phase 2). ... etc

Juga, saya baru-baru ini mengubah ke PHP 7.2 seperti yang direkomendasikan oleh penyedia hosting. Mengubah kembali ke 5.6 tidak mengubah gejalanya.

Ada ide apa yang menyebabkan ini? Saya telah melihat info yang menyarankan mungkin ProxyPassatau ProxyErrorOverridemungkin memperbaiki masalah, tetapi saya tidak tahu di mana harus mengaturnya.

Sebagai catatan, berikut adalah htaccess lengkap, kutil, dan semuanya:

RewriteEngine on

# AddType TYPE/SUBTYPE EXTENSION
AddType audio/mpeg mp3
AddType video/mp4 mp4 m4v

# Add WWW
RewriteCond %{HTTP_HOST} ^mydomain\.info [NC]
RewriteRule ^(.*) https://www.mydomain.info/$1 [R=301,L,NE] # Redirect for .COM RewriteCond %{HTTP_HOST} mydomain\.com$ [NC]
RewriteRule ^/?(.*) https://www.mydomain.info/$1 [R=301,L,NE] # Force HTTPS RewriteEngine On RewriteCond %{HTTPS} off RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L,NE] # Home page canonicalization RewriteCond %{THE_REQUEST} ^.*\/index\.htm\ HTTP/ RewriteRule ^(.*)index\.htm$ /$1 [R=301,L,NE] # Removed page_missing.htm Redirect 301 /page_missing.htm /new_page.htm#section_b # Some content moved to sub-folder Redirect 301 /extra_content.htm /extra/extra_content.htm # Internally redirect all HTM & HTML URLs to PHP RewriteCond %{REQUEST_FILENAME} !-f RewriteRule ^(.*)\.(htm|html)$ /$1\.php

# Error 404 page
ErrorDocument 404 /error404.php

<IfModule mod_expires.c>
    # Activate mod_expires for this directory
    ExpiresActive on

    # Default
    ExpiresDefault "access plus 7 days"

    # Default for actual documents
    ExpiresByType text/html "access plus 15 minutes"

    # cache CSS files for 7 days
    ExpiresByType text/css "access plus 7 days"

    # locally cache common resource types for 7 days
    ExpiresByType image/jpg "access plus 7 days"
    ExpiresByType image/jpeg "access plus 7 days"
    ExpiresByType image/gif "access plus 7 days"
    ExpiresByType image/png "access plus 7 days"
    ExpiresByType application/pdf "access plus 7 days"    
    ExpiresByType audio/mpeg "access plus 7 days"    
</IfModule> 

Jawaban

1 MrWhite Sep 11 2019 at 19:32
# Internally redirect all HTM & HTML URLs to PHP
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)\.(htm|html)$ /$1\.php

Saya tidak akan selalu berharap ini menyebabkan masalah yang Anda alami, namun, Anda memiliki arahan yang "membabi buta" menulis ulang permintaan yang tidak ada .htm(atau .html) ke .phpfile yang setara , apakah .phpfile itu ada atau tidak. (Dokumen kesalahan seharusnya menangkap .phpfile yang hilang , bukan .htmfile yang hilang yang awalnya diminta.)

Ini juga bisa menjelaskan perbedaan perilaku yang Anda lihat dengan meminta "direktori" yang tidak ada (yaitu. Permintaan formulir /dummy/), yang tidak akan ditulis ulang oleh petunjuk di atas dan tampak "berfungsi" sebagaimana dimaksud (mis. dokumen kesalahan kustom dipanggil).

Anda dapat mengubah aturan di atas untuk hanya menulis ulang .phpjika file tersebut ada. Sebagai contoh:

# Internally redirect all HTM & HTML URLs to PHP
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{DOCUMENT_ROOT}/$1.php -f RewriteRule ^(.*)\.(htm|html)$ /$1.php [L]

Tidak perlu menghilangkan titik literal dalam RewriteRule substitusi . Anda harus menyertakan Lflag (meskipun saat ini adalah direktif mod_rewrite terakhir, jadi tidak terlalu penting).


UPDATE: Jika Anda meminta halaman php yang tidak ada maka Anda masih mendapatkan respon "File tidak ditemukan".

Ini terdengar seperti masalah konfigurasi server. Anda mungkin dapat "mengatasi" masalah ini dengan menulis ulang ke dokumen kesalahan secara manual:

RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule \.php$ /error404.php [L]

Meskipun Anda mungkin perlu mengubah error404.phpakun untuk ini.

ATAU ... Saya juga ingin tahu apakah memicu 404 dari Apache (yang, secara sepintas, tampaknya tidak terlalu masuk akal) akan mengubah perilaku ini. Misalnya, alih-alih menulis ulang di atas:

RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule \.php$ - [R=404]

Ide di balik pendekatan ini adalah diharapkan akan memicu permintaan internal untuk dokumen kesalahan sebelum permintaan diteruskan ke penangan PHP (yang tampaknya bertentangan dengan dokumen kesalahan). Penangan PHP kemudian hanya dipanggil untuk melayani dokumen kesalahan.