當使用 PHP 作為 Apache 模塊時,也可以使用 Apache 配置文件(例如:httpd.conf) 和 .htaccess 文件中的指令來修改 PHP 的配置
設定,不過需要有 "AllowOverride Options" 或 "AllowOverride All" 權限才可以
哪些指令可以讓用戶在 Apache 配置文件內部修改 PHP 的配置?
屬於 PHP_INI_ALL、PHP_INI_PERDIR、或 PHP_INI_SYSTEM 中的一個,可以參考看 php.ini 配置選項列表:http://php.net/manual/zh/ini.list.php
php.ini 配置選項列表里面的"可修改范圍"決定了該配置在什么情況下可以被配置,可以參考:http://php.net/manual/zh/configuration.changes.modes.php
PHP_INI_* 模式定義了一個 PHP 指令在何時何地,是否能夠被設定,手冊中的每個指令都有其所屬的模式。例如有些指令可以在 PHP 腳本中用 ini_set
() 來設定,而有些只能在 php.ini 或 httpd.conf 中,例如:output_buffering 指令是屬於PHP_INI_PERDIR(可在 php.ini,.htaccess 或 httpd_conf 中設定),
因而就不能使用 ini_set() 來設定,但是像 display_errors 指令屬於 PHP_INI_ALL 因而就可以在任何地方被設定,包括使用 ini_set()
php_admin_value name value
設定指定的指令的值,不能用於 .htaccess 文件,任何用 php_admin_value 設定的指令都不能被 .htaccess 或 virtualhost 中的指令覆蓋
php_admin_flag name on | off
用來設定布爾值的配置指令 ,不能用於 .htaccess 文件,任何用 php_admin_flag 設定的指令都不能被 .htaccess 或 virtualhost 中的指令覆蓋
參考常見 apache php_admin_flag、php_admin_value 設置:
https://hcldirgit.github.io/2017/10/13/Php/7.%20%E5%B8%B8%E8%A7%81apache%20php_admin_value%20php_admin_flag%20%E8%AE%BE%E7%BD%AE/
注意:php_admin_flag、php_admin_value 一般用於 httpd.conf
php_value name value
設置指定的值,只能用於 PHP_INI_ALL 或 PHP_INI_PERDIR 類型的指令
php_flag name on | off
用來設定布爾值的配置指令,只能用於 PHP_INI_ALL 或 PHP_INI_PERDIR 類型的指令
php_value、php_flag 主要用於 .htaccess 中,但如果是 PHP_INI_ALL 類型的指令可以在任何地方被設定
而 value 和 flag 的區別在於:value 用於設置值,flag 用於只能是 on | off
--------------------------------------------------------2019/03/16 更新---------------------------------------------------------
關於 .htaccess 文件
參考文章:
https://blog.csdn.net/u013927110/article/details/41414091
https://www.centos.bz/2017/11/apache-htaccess%E6%96%87%E4%BB%B6%E8%AF%A6%E8%A7%A3%E5%92%8C%E9%85%8D%E7%BD%AE%E6%8A%80%E5%B7%A7%E6%80%BB%E7%BB%93/
.htaccess 文件是一個純文本文件,它里面存放着 apache 服務器配置的相關指令,。htaccess 主要的作用有:URL 重寫、自定義錯誤頁面等。主要體現在
偽靜態的應用、圖片防盜鏈、自定義404錯誤頁面、禁止訪問指定文件類型等等,.htaccess 的作用范圍針對當前目錄以及該目錄的子目錄
有時候我們需要修改 apache 的一些默認配置,但是又不想對 apache 的httpd.conf 修改太多,我們就可以使用
.htaccess(分布式配置文件) 來達到目的,.htaccess 提供了針對每個目錄改變配置的方法,即在一個特定目錄中放
置一個包含指令的文件,其中的指令作用於此目錄以及其所有的子目錄
我們需要讓 apache 來讀取它,這就需要修改 httpd.conf 文件
apache 都有自己默認的項目根目錄,在 DocumentRoot "D:/www" 下面,有一個<Directory>的東西,它里面有這樣一段代碼 AllowOverride None ,如果
我們把 None 改成 All,那么在 www 目錄下的所有項目都能讀取到 .htaccess
雖然僅僅只是改動一個單詞,但是這里面的弊端也是挺多的,比如說:每次訪問項目的時候,apache 都會對所有的 .htaccess 文件進行讀取,處理速度大
大降低;每一個項目都能修改 apache 配置,安全性大大降低
一般情況下都避免使用 .htaccess 原因主要有:
1. 性能:如果 AllowOverride 啟用了 .htaccess ,那么 apache 需要在每個目錄中查找 .htaccess 文件,所以,無論是否真正用到,啟用 .htaccess 都會導致
性能下降,另外,對每一個請求,都需要讀取一次 .htaccess 文件
2. 安全性:允許用戶修改 apache 配置,可能會導致一些意想不到的問題,所以需要認證考慮是否給與用戶這樣的權限。但是,如果給與用戶比較少的權限
可能又無法滿足用戶的需求,會帶來額外的技術支持,所以,需要明確告訴用戶已經給與他們的權限,說明AllowOverride設置的值,引導用戶使用