Apache - Halaman kesalahan khusus menampilkan kesalahan AH01071 hanya untuk permintaan file
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.htm
memberikan kesalahan tetapi meminta mydomain.info/dummy/
mengembalikan halaman kesalahan kustom.
Server mencatat kesalahan AH01071
yang Primary script unknown
untuk 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 ProxyPass
atau ProxyErrorOverride
mungkin 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
# 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 .php
file yang setara , apakah .php
file itu ada atau tidak. (Dokumen kesalahan seharusnya menangkap .php
file yang hilang , bukan .htm
file 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 .php
jika 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 L
flag (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.php
akun 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.