ฉันมีส่วนการกำหนดค่า apache 2.4 ที่ฉันใช้เพื่อจัดการกับสถานการณ์ที่หายาก ซึ่งกล่อง apache ที่กำหนดค่าไม่ถูกต้องสามารถให้บริการไฟล์ php เป็นข้อความธรรมดาแบบคงที่ และอาจทำให้ข้อมูลรับรอง ฯลฯ หายไป
<IfModule !mod_php5.c>
<IfModule !mod_php7.c>
<Files "*.php">
Require all denied
</Files>
</IfModule>
</IfModule>
คำสั่งเหล่านั้นจะตรวจสอบว่ามีโมดูล php อยู่หรือไม่ และหากไม่พบโมดูลใดโมดูลหนึ่ง ก็จะไม่ให้บริการหน้าดังกล่าว
อย่างไรก็ตามในรุ่นปัจจุบันของ httpd 2.4 สำหรับ centos-8 นั้น php-fpm เป็นวิธีเริ่มต้นในการกำหนดค่าตัวจัดการสำหรับ php และจะไม่โหลดโมดูลใด ๆ สำหรับ php:
<IfModule !mod_php5.c>
<IfModule !mod_php7.c>
# Enable http authorization headers
SetEnvIfNoCase ^Authorization$ "(.+)" HTTP_AUTHORIZATION=$1
<FilesMatch \.(php|phar)$>
SetHandler "proxy:unix:/run/php-fpm/www.sock|fcgi://localhost"
</FilesMatch>
</IfModule>
</IfModule>
น่าเสียดายที่โมดูล proxy_fcgi โหลดอัตโนมัติโดย httpd ดังนั้นจึงไม่มีประโยชน์เนื่องจากเป็นตัวบ่งชี้ว่ามีการกำหนดค่า php-fpm (หรือไม่):
[root@web httpd]# rpm -q --whatprovides /usr/lib64/httpd/modules/mod_proxy_fcgi.so
httpd-2.4.37-39.module_el8.4.0+778+c970deab.x86_64
ตาม เอกสาร มี แฮนด์เลอร์
ตัวแปร:
HANDLER ชื่อของตัวจัดการที่สร้างการตอบสนอง
... ซึ่งควรส่งคืนอย่างใดอย่างหนึ่ง ในตัวจัดการที่สร้างขึ้น
ตัวจัดการเริ่มต้น: ส่งไฟล์โดยใช้ default_handler() ซึ่งเป็นตัวจัดการที่ใช้โดยค่าเริ่มต้นเพื่อจัดการเนื้อหาคงที่ (หลัก)
send-as-is: ส่งไฟล์ที่มีส่วนหัว HTTP ตามที่เป็นอยู่ (mod_asis)
cgi-script: ถือว่าไฟล์เป็นสคริปต์ CGI (mod_cgi)
ไฟล์ imap: แยกวิเคราะห์เป็นไฟล์กฎของ imagemap (mod_imagemap)
ข้อมูลเซิร์ฟเวอร์: รับข้อมูลการกำหนดค่าของเซิร์ฟเวอร์ (mod_info)
สถานะเซิร์ฟเวอร์: รับรายงานสถานะของเซิร์ฟเวอร์ (mod_สถานะ)
แผนที่ประเภท: แยกวิเคราะห์เป็นไฟล์แผนที่ประเภทสำหรับการเจรจาเนื้อหา (mod_negotiation)
อย่างไรก็ตาม ความพยายามของฉันในการจับคู่กับมันไม่ประสบความสำเร็จ เช่น สิ่งนี้ไม่ทำงาน:
<FilesMatch \.(php|phar)$>
<If "%{HANDLER} == 'default-handler'">
Require all denied
</If>
</FilesMatch>
ข้อเสนอแนะใด ๆ ที่ชื่นชม
แก้ไข
ฉันทิ้งค่าของตัวแปร %{HANDLER} ทั้งที่ติดตั้ง php-fpm และไม่เป็นเช่นนั้น:
<IfModule headers_module>
Header always set X-HANDLER "expr=%{HANDLER}"
</IfModule>
และส่งคืนส่วนหัวต่อไปนี้:
X-HANDLER: ข้อความ/ธรรมดา # ไม่มี php-fpm
X-HANDLER: proxy:unix:/run/php-fpm/www.sock|fcgi://localhost # กับ php-fpm
ดังนั้นฉันจึงอัปเดตการทดสอบเป็น:
<IfModule !mod_php5.c>
<IfModule !mod_php7.c>
<If "%{HANDLER} == 'text/plain'">
<Files "*.php">
Require all denied
</Files>
</If>
</IfModule>
</IfModule>
อย่างไรก็ตามนั่นก็ไม่ได้ผลเช่นกัน