類別 yii\web\Request
繼承 | yii\web\Request » yii\base\Request » yii\base\Component » yii\base\BaseObject |
---|---|
實作 | yii\base\Configurable |
自版本起可用 | 2.0 |
原始碼 | https://github.com/yiisoft/yii2/blob/master/framework/web/Request.php |
web Request 類別代表一個 HTTP 請求。
它封裝了 $_SERVER 變數,並解決了不同 Web 伺服器之間的不一致性。此外,它還提供了一個介面,用於從 $_POST、$_GET、$_COOKIES 和透過其他 HTTP 方法(如 PUT 或 DELETE)傳送的 REST 參數中檢索請求參數。
Request 預設在 yii\web\Application 中配置為應用程式元件。您可以透過 Yii::$app->request
存取該實例。
有關 Request 的更多詳細資訊和使用方法,請參閱關於請求的指南文章。
公開屬性
公共方法
保護方法
方法 | 描述 | 定義於 |
---|---|---|
createCsrfCookie() | 建立包含隨機產生 CSRF 令牌的 Cookie。 | yii\web\Request |
filterHeaders() | 根據 $trustedHosts 過濾 Header。 | yii\web\Request |
generateCsrfToken() | 產生未遮罩的隨機令牌,用於執行 CSRF 驗證。 | yii\web\Request |
getIpValidator() | 建立 yii\validators\IpValidator 的實例。 | yii\web\Request |
getSecureForwardedHeaderParts() | 傳回已解碼的轉發 Header | yii\web\Request |
getSecureForwardedHeaderTrustedPart() | 取得令牌的第一個 Forwarded Header 值 |
yii\web\Request |
getSecureForwardedHeaderTrustedParts() | 僅取得受信任的 Forwarded Header 部分 |
yii\web\Request |
getTrustedHeaders() | 根據 $trustedHosts 的受信任 Header。 | yii\web\Request |
getUserIpFromIpHeader() | 從 IP Header 傳回使用者 IP。 | yii\web\Request |
getUserIpFromIpHeaders() | 從 $ipHeaders 傳回使用者 IP 位址。 | yii\web\Request |
loadCookies() | 將 $_COOKIE 轉換為 yii\web\Cookie 的陣列。 |
yii\web\Request |
loadCsrfToken() | 從 Cookie 或 Session 載入 CSRF 令牌。 | yii\web\Request |
resolvePathInfo() | 解析目前請求 URL 的路徑資訊部分。 | yii\web\Request |
resolveRequestUri() | 解析目前請求 URL 的請求 URI 部分。 | yii\web\Request |
常數
常數 | 值 | 描述 | 定義於 |
---|---|---|---|
CSRF_HEADER | 'X-CSRF-Token' | 用於傳送 CSRF 令牌的 HTTP Header 名稱。 | yii\web\Request |
CSRF_MASK_LENGTH | 8 | CSRF 令牌遮罩的長度。 自 2.0.12 版本起已棄用。遮罩長度現在等於令牌長度。 | yii\web\Request |
屬性詳細資訊
依據品質分數排序的內容類型。分數最高的類型將首先傳回。陣列鍵為內容類型,而陣列值為 Header 中給定的相應品質分數和其他參數。
包含兩個元素的陣列:- 0:透過 HTTP 驗證傳送的使用者名稱,如果未提供使用者名稱則為 null
- 1:透過 HTTP 驗證傳送的密碼,如果未提供密碼則為 null
。
用於建立 CSRF Cookie 的配置。僅當 $enableCsrfValidation 和 $enableCsrfCookie 皆為 true 時,才會使用此屬性。
用於防止 CSRF 的令牌名稱。預設值為 '_csrf'。僅當 $enableCsrfValidation 為 true 時,才會使用此屬性。
瀏覽器透過 CSRF_HEADER 傳送的 CSRF 令牌。如果未傳送此 Header,則傳回 Null。
是否應驗證 Cookie,以確保它們未被篡改。預設值為 true。
是否使用 Cookie 來持久化 CSRF 令牌。若為 false,CSRF 令牌將會以 $csrfParam 為名稱儲存在 session 中。請注意,雖然將 CSRF 令牌儲存在 session 中可以提高安全性,但這會要求每個頁面都啟動 session,進而降低您的網站效能。
是否啟用 CSRF(跨站請求偽造)驗證。預設值為 true。當 CSRF 驗證啟用時,提交到 Yii Web 應用程式的表單必須源自同一個應用程式。否則,將會拋出 400 HTTP 例外。
請注意,此功能需要使用者端接受 Cookie。此外,要使用此功能,透過 POST 方法提交的表單必須包含一個隱藏的輸入欄位,其名稱由 $csrfParam 指定。您可以使用 yii\helpers\Html::beginForm() 來產生這個隱藏的輸入欄位。
在 JavaScript 中,您可以分別透過 yii.getCsrfParam()
和 yii.getCsrfToken()
取得 $csrfParam 和 $csrfToken 的值。yii\web\YiiAsset 資源必須被註冊。您也需要在頁面中包含 CSRF meta 標籤,方法是使用 yii\helpers\Html::csrfMetaTags()。
另請參閱
請求 URL 的協定和主機名稱部分(必要時包含埠號)(例如:https://yii.dev.org.tw
)。如果無法從 $_SERVER
取得且未設定,則為 null。關於此屬性的安全性相關注意事項,請參閱 getHostInfo()。
代理伺服器儲存真實客戶端 IP 的標頭列表。不建議在此處放置不安全的標頭。若要根據 RFC 7239 使用 Forwarded
標頭,則必須將該標頭添加到 $secureHeaders 列表中。標頭名稱的比對不區分大小寫。
另請參閱
用於指示請求是否為透過 POST 通道的 PUT、PATCH 或 DELETE 請求的 POST 參數名稱。預設值為 '_method'。
另請參閱
用於將原始 HTTP 請求主體轉換為 $bodyParams 的解析器。陣列的鍵是請求的 Content-Types
,而陣列的值是用於 建立解析器物件 的相應配置。解析器必須實作 yii\web\RequestParserInterface。
若要啟用 JSON 請求的解析,您可以使用 yii\web\JsonParser 類別,如下例所示
[
'application/json' => 'yii\web\JsonParser',
]
若要註冊一個用於解析所有請求類型的解析器,您可以使用 '*'
作為陣列的鍵。如果沒有其他類型匹配,則將使用此解析器作為後備方案。
另請參閱 getBodyParams()。
代理伺服器儲存真實請求埠號的標頭列表。不建議在此處放置不安全的標頭。若要使用 Forwarded Port
,則必須將該標頭添加到 $secureHeaders 列表中。標頭名稱的比對不區分大小寫。
另請參閱
預設情況下,受信任主機配置約束的標頭列表。除非在 $trustedHosts 中明確允許,否則這些標頭將會被過濾。如果列表包含 Forwarded
標頭,則將根據 RFC 7239 進行處理。標頭名稱的比對不區分大小寫。
另請參閱
'X-Forwarded-For',
'X-Forwarded-Host',
'X-Forwarded-Proto',
'X-Forwarded-Port',
'Front-End-Https',
'X-Rewrite-Url',
'X-Original-Host',
]
用於檢查以判斷連線是否透過 HTTPS 建立的標頭列表。陣列的鍵是標頭名稱,而陣列的值是標頭值的列表,這些值指示安全連線。標頭名稱和值的比對不區分大小寫。不建議在此處放置不安全的標頭。
另請參閱
'X-Forwarded-Proto' => [
'https',
],
'Front-End-Https' => [
'on',
],
]
用於信任安全相關 Header 的配置。
陣列的鍵值為 IPv4 或 IPv6 IP 位址,以 CIDR 標記法表示,用於比對客戶端。
陣列的值是要信任的標頭列表。這些標頭將與 $secureHeaders 比對,以判斷哪些標頭允許由指定的 host 發送。標頭名稱的大小寫必須與 $secureHeaders 中指定的相同。
例如,要信任 $secureHeaders 中列出的所有標頭,適用於 192.168.0.0-192.168.0.254
範圍內的 IP 位址,請寫入以下內容
[
'192.168.0.0/24',
]
若要僅信任來自 10.0.0.1
的 X-Forwarded-For
標頭,請使用
[
'10.0.0.1' => ['X-Forwarded-For']
]
預設情況下,信任來自所有 host 的所有標頭,但 $secureHeaders 中列出的標頭除外。比對會依序嘗試,並在 IP 符合時停止搜尋。
資訊:比對使用 yii\validators\IpValidator 執行。請參閱 IpValidator::::setRanges() 和 yii\validators\IpValidator::$networks 以取得進階比對。
另請參閱 $secureHeaders。
方法詳細資訊
定義於: yii\base\Component::__call()
呼叫指定的非類別方法。
此方法將檢查是否有任何附加的行為具有指定的名稱方法,如果有,則會執行它。
請勿直接呼叫此方法,因為它是一個 PHP 魔術方法,當調用未知方法時會隱式呼叫。
public mixed __call ( $name, $params ) | ||
$name | string |
方法名稱 |
$params | array |
方法參數 |
return | mixed |
方法傳回值 |
---|---|---|
throws | yii\base\UnknownMethodException |
當呼叫未知方法時 |
public function __call($name, $params)
{
$this->ensureBehaviors();
foreach ($this->_behaviors as $object) {
if ($object->hasMethod($name)) {
return call_user_func_array([$object, $name], $params);
}
}
throw new UnknownMethodException('Calling unknown method: ' . get_class($this) . "::$name()");
}
public void __clone ( ) |
public function __clone()
{
$this->_events = [];
$this->_eventWildcards = [];
$this->_behaviors = null;
}
定義於: yii\base\BaseObject::__construct()
建構子。
預設實作會執行兩件事
- 使用給定的組態
$config
初始化物件。 - 呼叫 init()。
如果此方法在子類別中被覆寫,建議
- 建構子的最後一個參數是組態陣列,例如此處的
$config
。 - 在建構子的結尾呼叫父類別實作。
public void __construct ( $config = [] ) | ||
$config | array |
將用於初始化物件屬性的名稱-值對 |
public function __construct($config = [])
{
if (!empty($config)) {
Yii::configure($this, $config);
}
$this->init();
}
定義於: yii\base\Component::__get()
傳回組件屬性的值。
此方法將依以下順序檢查並採取相應的動作
- getter 定義的屬性:傳回 getter 結果
- 行為的屬性:傳回行為屬性值
請勿直接呼叫此方法,因為它是一個 PHP 魔術方法,當執行 $value = $component->property;
時會隱式呼叫。
另請參閱 __set()。
public mixed __get ( $name ) | ||
$name | string |
屬性名稱 |
return | mixed |
屬性值或行為屬性的值 |
---|---|---|
throws | yii\base\UnknownPropertyException |
如果未定義屬性 |
throws | yii\base\InvalidCallException |
如果屬性為唯寫。 |
public function __get($name)
{
$getter = 'get' . $name;
if (method_exists($this, $getter)) {
// read property, e.g. getName()
return $this->$getter();
}
// behavior property
$this->ensureBehaviors();
foreach ($this->_behaviors as $behavior) {
if ($behavior->canGetProperty($name)) {
return $behavior->$name;
}
}
if (method_exists($this, 'set' . $name)) {
throw new InvalidCallException('Getting write-only property: ' . get_class($this) . '::' . $name);
}
throw new UnknownPropertyException('Getting unknown property: ' . get_class($this) . '::' . $name);
}
定義於: yii\base\Component::__isset()
檢查屬性是否已設定,即已定義且非 null。
此方法將依以下順序檢查並採取相應的動作
- setter 定義的屬性:傳回屬性是否已設定
- 行為的屬性:傳回屬性是否已設定
- 對於不存在的屬性,傳回
false
請勿直接呼叫此方法,因為它是一個 PHP 魔術方法,當執行 isset($component->property)
時會隱式呼叫。
public boolean __isset ( $name ) | ||
$name | string |
屬性名稱或事件名稱 |
return | boolean |
具名屬性是否已設定 |
---|
public function __isset($name)
{
$getter = 'get' . $name;
if (method_exists($this, $getter)) {
return $this->$getter() !== null;
}
// behavior property
$this->ensureBehaviors();
foreach ($this->_behaviors as $behavior) {
if ($behavior->canGetProperty($name)) {
return $behavior->$name !== null;
}
}
return false;
}
定義於: yii\base\Component::__set()
設定組件屬性的值。
此方法將依以下順序檢查並採取相應的動作
- setter 定義的屬性:設定屬性值
- 格式為 "on xyz" 的事件:將處理常式附加到事件 "xyz"
- 格式為 "as xyz" 的行為:附加名為 "xyz" 的行為
- 行為的屬性:設定行為屬性值
請勿直接呼叫此方法,因為它是一個 PHP 魔術方法,當執行 $component->property = $value;
時會隱式呼叫。
另請參閱 __get()。
public void __set ( $name, $value ) | ||
$name | string |
屬性名稱或事件名稱 |
$value | mixed |
屬性值 |
throws | yii\base\UnknownPropertyException |
如果未定義屬性 |
---|---|---|
throws | yii\base\InvalidCallException |
如果屬性為唯讀。 |
public function __set($name, $value)
{
$setter = 'set' . $name;
if (method_exists($this, $setter)) {
// set property
$this->$setter($value);
return;
} elseif (strncmp($name, 'on ', 3) === 0) {
// on event: attach event handler
$this->on(trim(substr($name, 3)), $value);
return;
} elseif (strncmp($name, 'as ', 3) === 0) {
// as behavior: attach behavior
$name = trim(substr($name, 3));
$this->attachBehavior($name, $value instanceof Behavior ? $value : Yii::createObject($value));
return;
}
// behavior property
$this->ensureBehaviors();
foreach ($this->_behaviors as $behavior) {
if ($behavior->canSetProperty($name)) {
$behavior->$name = $value;
return;
}
}
if (method_exists($this, 'get' . $name)) {
throw new InvalidCallException('Setting read-only property: ' . get_class($this) . '::' . $name);
}
throw new UnknownPropertyException('Setting unknown property: ' . get_class($this) . '::' . $name);
}
定義於: yii\base\Component::__unset()
將組件屬性設定為 null。
此方法將依以下順序檢查並採取相應的動作
- setter 定義的屬性:將屬性值設定為 null
- 行為的屬性:將屬性值設定為 null
請勿直接呼叫此方法,因為它是一個 PHP 魔術方法,當執行 unset($component->property)
時會隱式呼叫。
public void __unset ( $name ) | ||
$name | string |
屬性名稱 |
throws | yii\base\InvalidCallException |
如果屬性為唯讀。 |
---|
public function __unset($name)
{
$setter = 'set' . $name;
if (method_exists($this, $setter)) {
$this->$setter(null);
return;
}
// behavior property
$this->ensureBehaviors();
foreach ($this->_behaviors as $behavior) {
if ($behavior->canSetProperty($name)) {
$behavior->$name = null;
return;
}
}
throw new InvalidCallException('Unsetting an unknown or read-only property: ' . get_class($this) . '::' . $name);
}
定義於: yii\base\Component::attachBehavior()
將行為附加到此組件。
此方法將根據給定的組態建立行為物件。之後,將透過呼叫 yii\base\Behavior::attach() 方法將行為物件附加到此元件。
另請參閱 detachBehavior()。
public yii\base\Behavior attachBehavior ( $name, $behavior ) | ||
$name | string |
行為的名稱。 |
$behavior | string|array|yii\base\Behavior |
行為組態。這可以是以下其中之一
|
return | yii\base\Behavior |
行為物件 |
---|
public function attachBehavior($name, $behavior)
{
$this->ensureBehaviors();
return $this->attachBehaviorInternal($name, $behavior);
}
定義於: yii\base\Component::attachBehaviors()
將行為列表附加到組件。
每個行為都由其名稱索引,並且應該是 yii\base\Behavior 物件、指定行為類別的字串,或是用於建立行為的組態陣列。
另請參閱 attachBehavior()。
public void attachBehaviors ( $behaviors ) | ||
$behaviors | array |
要附加到元件的行為列表 |
public function attachBehaviors($behaviors)
{
$this->ensureBehaviors();
foreach ($behaviors as $name => $behavior) {
$this->attachBehaviorInternal($name, $behavior);
}
}
定義於: yii\base\Component::behaviors()
傳回此組件應表現為的行為列表。
子類別可以覆寫此方法,以指定它們想要表現為的行為。
此方法的傳回值應該是由行為名稱索引的行為物件或組態陣列。行為組態可以是指定行為類別的字串,或具有以下結構的陣列
'behaviorName' => [
'class' => 'BehaviorClass',
'property1' => 'value1',
'property2' => 'value2',
]
請注意,行為類別必須從 yii\base\Behavior 擴展。行為可以使用名稱或匿名方式附加。當名稱用作陣列鍵時,使用此名稱,稍後可以使用 getBehavior() 檢索行為,或使用 detachBehavior() 分離行為。匿名行為無法檢索或分離。
在此方法中宣告的行為將自動(按需)附加到元件。
public array behaviors ( ) | ||
return | array |
行為組態。 |
---|
public function behaviors()
{
return [];
}
定義於: yii\base\Component::canGetProperty()
傳回一個值,指示屬性是否可讀取。
如果符合以下條件,則可以讀取屬性
- 類別具有與指定名稱關聯的 getter 方法(在這種情況下,屬性名稱不區分大小寫);
- 類別具有具有指定名稱的成員變數(當
$checkVars
為 true 時); - 附加的行為具有給定名稱的可讀屬性(當
$checkBehaviors
為 true 時)。
另請參閱 canSetProperty()。
public boolean canGetProperty ( $name, $checkVars = true, $checkBehaviors = true ) | ||
$name | string |
屬性名稱 |
$checkVars | boolean |
是否將成員變數視為屬性 |
$checkBehaviors | boolean |
是否將行為的屬性視為此元件的屬性 |
return | boolean |
屬性是否可讀 |
---|
public function canGetProperty($name, $checkVars = true, $checkBehaviors = true)
{
if (method_exists($this, 'get' . $name) || $checkVars && property_exists($this, $name)) {
return true;
} elseif ($checkBehaviors) {
$this->ensureBehaviors();
foreach ($this->_behaviors as $behavior) {
if ($behavior->canGetProperty($name, $checkVars)) {
return true;
}
}
}
return false;
}
定義於: yii\base\Component::canSetProperty()
傳回一個值,指示屬性是否可設定。
如果符合以下條件,則可以寫入屬性
- 類別具有與指定名稱關聯的 setter 方法(在這種情況下,屬性名稱不區分大小寫);
- 類別具有具有指定名稱的成員變數(當
$checkVars
為 true 時); - 附加的行為具有給定名稱的可寫屬性(當
$checkBehaviors
為 true 時)。
另請參閱 canGetProperty()。
public boolean canSetProperty ( $name, $checkVars = true, $checkBehaviors = true ) | ||
$name | string |
屬性名稱 |
$checkVars | boolean |
是否將成員變數視為屬性 |
$checkBehaviors | boolean |
是否將行為的屬性視為此元件的屬性 |
return | boolean |
屬性是否可寫入 |
---|
public function canSetProperty($name, $checkVars = true, $checkBehaviors = true)
{
if (method_exists($this, 'set' . $name) || $checkVars && property_exists($this, $name)) {
return true;
} elseif ($checkBehaviors) {
$this->ensureBehaviors();
foreach ($this->_behaviors as $behavior) {
if ($behavior->canSetProperty($name, $checkVars)) {
return true;
}
}
}
return false;
}
::class
。
定義於: yii\base\BaseObject::className()
傳回此類別的完整名稱。
public static string className ( ) | ||
return | string |
此類別的完整限定名稱。 |
---|
public static function className()
{
return get_called_class();
}
protected yii\web\Cookie createCsrfCookie ( $token ) | ||
$token | string |
CSRF token |
return | yii\web\Cookie |
產生的 cookie |
---|
protected function createCsrfCookie($token)
{
$options = $this->csrfCookie;
return Yii::createObject(array_merge($options, [
'class' => 'yii\web\Cookie',
'name' => $this->csrfParam,
'value' => $token,
]));
}
public yii\base\Behavior|null detachBehavior ( $name ) | ||
$name | string |
行為的名稱。 |
return | yii\base\Behavior|null |
分離的行為。如果行為不存在,則為 Null。 |
---|
public function detachBehavior($name)
{
$this->ensureBehaviors();
if (isset($this->_behaviors[$name])) {
$behavior = $this->_behaviors[$name];
unset($this->_behaviors[$name]);
$behavior->detach();
return $behavior;
}
return null;
}
定義於: yii\base\Component::detachBehaviors()
從組件分離所有行為。
public void detachBehaviors ( ) |
public function detachBehaviors()
{
$this->ensureBehaviors();
foreach ($this->_behaviors as $name => $behavior) {
$this->detachBehavior($name);
}
}
定義於: yii\base\Component::ensureBehaviors()
確保在 behaviors() 中宣告的行為已附加到此組件。
public void ensureBehaviors ( ) |
public function ensureBehaviors()
{
if ($this->_behaviors === null) {
$this->_behaviors = [];
foreach ($this->behaviors() as $name => $behavior) {
$this->attachBehaviorInternal($name, $behavior);
}
}
}
根據 $trustedHosts 過濾 Header。
protected void filterHeaders ( yii\web\HeaderCollection $headerCollection ) | ||
$headerCollection | yii\web\HeaderCollection |
protected function filterHeaders(HeaderCollection $headerCollection)
{
$trustedHeaders = $this->getTrustedHeaders();
// remove all secure headers unless they are trusted
foreach ($this->secureHeaders as $secureHeader) {
if (!in_array($secureHeader, $trustedHeaders)) {
$headerCollection->remove($secureHeader);
}
}
}
產生未遮罩的隨機令牌,用於執行 CSRF 驗證。
protected string generateCsrfToken ( ) | ||
return | string |
用於 CSRF 驗證的隨機 token。 |
---|
protected function generateCsrfToken()
{
$token = Yii::$app->getSecurity()->generateRandomString();
if ($this->enableCsrfCookie) {
$cookie = $this->createCsrfCookie($token);
Yii::$app->getResponse()->getCookies()->add($cookie);
} else {
Yii::$app->getSession()->set($this->csrfParam, $token);
}
return $token;
}
傳回具有指定名稱的 GET 參數。如果未指定名稱,則傳回所有 GET 參數的陣列。
public array|mixed get ( $name = null, $defaultValue = null ) | ||
$name | string |
參數名稱 |
$defaultValue | mixed |
如果參數不存在,則為預設參數值。 |
public function get($name = null, $defaultValue = null)
{
if ($name === null) {
return $this->getQueryParams();
}
return $this->getQueryParam($name, $defaultValue);
}
public string getAbsoluteUrl ( ) | ||
return | string |
目前請求的絕對 URL。 |
---|
public function getAbsoluteUrl()
{
return $this->getHostInfo() . $this->getUrl();
}
傳回終端使用者可接受的內容類型。
這由 Accept
HTTP 標頭決定。例如:
$_SERVER['HTTP_ACCEPT'] = 'text/plain; q=0.5, application/json; version=1.0, application/xml; version=2.0;';
$types = $request->getAcceptableContentTypes();
print_r($types);
// displays:
// [
// 'application/json' => ['q' => 1, 'version' => '1.0'],
// 'application/xml' => ['q' => 1, 'version' => '2.0'],
// 'text/plain' => ['q' => 0.5],
// ]
public array getAcceptableContentTypes ( ) | ||
return | array |
依據品質分數排序的內容類型。分數最高的類型將首先傳回。陣列鍵為內容類型,而陣列值為 Header 中給定的相應品質分數和其他參數。 |
---|
public function getAcceptableContentTypes()
{
if ($this->_contentTypes === null) {
if ($this->headers->get('Accept') !== null) {
$this->_contentTypes = $this->parseAcceptHeader($this->headers->get('Accept'));
} else {
$this->_contentTypes = [];
}
}
return $this->_contentTypes;
}
傳回終端使用者可接受的語言。
這由 Accept-Language
HTTP 標頭決定。
public array getAcceptableLanguages ( ) | ||
return | array |
依據偏好程度排序的語言。第一個元素代表最偏好的語言。 |
---|
public function getAcceptableLanguages()
{
if ($this->_languages === null) {
if ($this->headers->has('Accept-Language')) {
$this->_languages = array_keys($this->parseAcceptHeader($this->headers->get('Accept-Language')));
} else {
$this->_languages = [];
}
}
return $this->_languages;
}
public array getAuthCredentials ( ) | ||
return | array |
包含正好兩個元素
|
---|
public function getAuthCredentials()
{
$username = isset($_SERVER['PHP_AUTH_USER']) ? $_SERVER['PHP_AUTH_USER'] : null;
$password = isset($_SERVER['PHP_AUTH_PW']) ? $_SERVER['PHP_AUTH_PW'] : null;
if ($username !== null || $password !== null) {
return [$username, $password];
}
/**
* Apache with php-cgi does not pass HTTP Basic authentication to PHP by default.
* To make it work, add one of the following lines to to your .htaccess file:
*
* SetEnvIf Authorization .+ HTTP_AUTHORIZATION=$0
* --OR--
* RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]
*/
$auth_token = $this->getHeaders()->get('Authorization');
if ($auth_token !== null && strncasecmp($auth_token, 'basic', 5) === 0) {
$parts = array_map(function ($value) {
return strlen($value) === 0 ? null : $value;
}, explode(':', base64_decode(mb_substr($auth_token, 6)), 2));
if (count($parts) < 2) {
return [$parts[0], null];
}
return $parts;
}
return [null, null];
}
另請參閱 getAuthCredentials() 以一次取得使用者名稱和密碼。
public string|null getAuthPassword ( ) | ||
return | string|null |
透過 HTTP 驗證傳送的密碼,如果未提供密碼則為 |
---|
public function getAuthPassword()
{
return $this->getAuthCredentials()[1];
}
另請參閱 getAuthCredentials() 以一次取得使用者名稱和密碼。
public string|null getAuthUser ( ) | ||
return | string|null |
透過 HTTP 驗證傳送的使用者名稱,如果未提供使用者名稱則為 |
---|
public function getAuthUser()
{
return $this->getAuthCredentials()[0];
}
public string getBaseUrl ( ) | ||
return | string |
應用程式的相對 URL |
---|
public function getBaseUrl()
{
if ($this->_baseUrl === null) {
$this->_baseUrl = rtrim(dirname($this->getScriptUrl()), '\\/');
}
return $this->_baseUrl;
}
定義於: yii\base\Component::getBehavior()
傳回指定的行為物件。
public yii\base\Behavior|null getBehavior ( $name ) | ||
$name | string |
行為名稱 |
return | yii\base\Behavior|null |
行為物件,如果行為不存在則為 null |
---|
public function getBehavior($name)
{
$this->ensureBehaviors();
return isset($this->_behaviors[$name]) ? $this->_behaviors[$name] : null;
}
定義於: yii\base\Component::getBehaviors()
傳回附加到此組件的所有行為。
public yii\base\Behavior[] getBehaviors ( ) | ||
return | yii\base\Behavior[] |
附加到此元件的行為列表 |
---|
public function getBehaviors()
{
$this->ensureBehaviors();
return $this->_behaviors;
}
public mixed getBodyParam ( $name, $defaultValue = null ) | ||
$name | string |
參數名稱 |
$defaultValue | mixed |
如果參數不存在,則為預設參數值。 |
return | mixed |
參數值 |
---|
public function getBodyParam($name, $defaultValue = null)
{
$params = $this->getBodyParams();
if (is_object($params)) {
// unable to use `ArrayHelper::getValue()` due to different dots in key logic and lack of exception handling
try {
return isset($params->{$name}) ? $params->{$name} : $defaultValue;
} catch (\Exception $e) {
return $defaultValue;
}
}
return isset($params[$name]) ? $params[$name] : $defaultValue;
}
傳回請求 body 中提供的請求參數。
請求參數是使用 $parsers 屬性中配置的解析器確定的。如果沒有為當前的 $contentType 配置解析器,它會使用 PHP 函數 mb_parse_str()
來解析 請求主體。
另請參閱
public array|object getBodyParams ( ) | ||
return | array|object |
請求 body 中提供的請求參數。 |
---|---|---|
throws | yii\base\InvalidConfigException |
如果已註冊的解析器未實作 yii\web\RequestParserInterface。 |
public function getBodyParams()
{
if ($this->_bodyParams === null) {
if (isset($_POST[$this->methodParam])) {
$this->_bodyParams = $_POST;
unset($this->_bodyParams[$this->methodParam]);
return $this->_bodyParams;
}
$rawContentType = $this->getContentType();
if (($pos = strpos((string)$rawContentType, ';')) !== false) {
// e.g. text/html; charset=UTF-8
$contentType = substr($rawContentType, 0, $pos);
} else {
$contentType = $rawContentType;
}
if (isset($this->parsers[$contentType])) {
$parser = Yii::createObject($this->parsers[$contentType]);
if (!($parser instanceof RequestParserInterface)) {
throw new InvalidConfigException("The '$contentType' request parser is invalid. It must implement the yii\\web\\RequestParserInterface.");
}
$this->_bodyParams = $parser->parse($this->getRawBody(), $rawContentType);
} elseif (isset($this->parsers['*'])) {
$parser = Yii::createObject($this->parsers['*']);
if (!($parser instanceof RequestParserInterface)) {
throw new InvalidConfigException('The fallback request parser is invalid. It must implement the yii\\web\\RequestParserInterface.');
}
$this->_bodyParams = $parser->parse($this->getRawBody(), $rawContentType);
} elseif ($this->getMethod() === 'POST') {
// PHP has already parsed the body so we have all params in $_POST
$this->_bodyParams = $_POST;
} else {
$this->_bodyParams = [];
mb_parse_str($this->getRawBody(), $this->_bodyParams);
}
}
return $this->_bodyParams;
}
傳回請求內容類型。Content-Type Header 欄位指示 getRawBody() 中包含的資料的 MIME 類型,或者在 HEAD 方法的情況下,指示如果請求為 GET 時本應傳送的媒體類型。
對於使用者期望在回應中看到的 MIME 類型,請參閱 $acceptableContentTypes。
public string getContentType ( ) | ||
return | string |
請求內容類型。如果此資訊不可用,則傳回空字串。 |
---|
public function getContentType()
{
if (isset($_SERVER['CONTENT_TYPE'])) {
return $_SERVER['CONTENT_TYPE'];
}
//fix bug https://bugs.php.net/bug.php?id=66606
return $this->headers->get('Content-Type') ?: '';
}
傳回 Cookie 集合。
透過傳回的 cookie 集合,您可以使用以下語法存取 cookie
$cookie = $request->cookies['name']
if ($cookie !== null) {
$value = $cookie->value;
}
// alternatively
$value = $request->cookies->getValue('name');
public yii\web\CookieCollection getCookies ( ) | ||
return | yii\web\CookieCollection |
Cookie 集合。 |
---|
public function getCookies()
{
if ($this->_cookies === null) {
$this->_cookies = new CookieCollection($this->loadCookies(), [
'readOnly' => true,
]);
}
return $this->_cookies;
}
傳回用於執行 CSRF 驗證的令牌。
此權杖的產生方式旨在防止 BREACH 攻擊。它可以透過 HTML 表單的隱藏欄位或 HTTP 標頭值傳遞,以支援 CSRF 驗證。
public string getCsrfToken ( $regenerate = false ) | ||
$regenerate | boolean |
是否重新產生 CSRF 權杖。當此參數為 true 時,每次呼叫此方法都會產生並持久化(在 session 或 cookie 中)一個新的 CSRF 權杖。 |
return | string |
用於執行 CSRF 驗證的令牌。 |
---|
public function getCsrfToken($regenerate = false)
{
if ($this->_csrfToken === null || $regenerate) {
$token = $this->loadCsrfToken();
if ($regenerate || empty($token)) {
$token = $this->generateCsrfToken();
}
$this->_csrfToken = Yii::$app->security->maskToken($token);
}
return $this->_csrfToken;
}
public string|null getCsrfTokenFromHeader ( ) | ||
return | string|null |
瀏覽器透過 CSRF_HEADER 傳送的 CSRF 令牌。如果未傳送此 Header,則傳回 Null。 |
---|
public function getCsrfTokenFromHeader()
{
return $this->headers->get(static::CSRF_HEADER);
}
取得 Etags。
public array getETags ( ) | ||
return | array |
實體標籤 |
---|
public function getETags()
{
if ($this->headers->has('If-None-Match')) {
return preg_split('/[\s,]+/', str_replace('-gzip', '', $this->headers->get('If-None-Match')), -1, PREG_SPLIT_NO_EMPTY);
}
return [];
}
傳回 Header 集合。
標頭集合包含傳入的 HTTP 標頭。
public yii\web\HeaderCollection getHeaders ( ) | ||
return | yii\web\HeaderCollection |
標頭集合 |
---|
public function getHeaders()
{
if ($this->_headers === null) {
$this->_headers = new HeaderCollection();
if (function_exists('getallheaders')) {
$headers = getallheaders();
foreach ($headers as $name => $value) {
$this->_headers->add($name, $value);
}
} elseif (function_exists('http_get_request_headers')) {
$headers = http_get_request_headers();
foreach ($headers as $name => $value) {
$this->_headers->add($name, $value);
}
} else {
// ['prefix' => length]
$headerPrefixes = ['HTTP_' => 5, 'REDIRECT_HTTP_' => 14];
foreach ($_SERVER as $name => $value) {
foreach ($headerPrefixes as $prefix => $length) {
if (strncmp($name, $prefix, $length) === 0) {
$name = str_replace(' ', '-', ucwords(strtolower(str_replace('_', ' ', substr($name, $length)))));
$this->_headers->add($name, $value);
continue 2;
}
}
}
}
$this->filterHeaders($this->_headers);
}
return $this->_headers;
}
傳回當前請求 URL 的 Schema 和主機部分。
傳回的 URL 沒有結尾斜線。
預設情況下,此值基於使用者請求資訊。如果 $_SERVER['HTTP_HOST']
可用,此方法將傳回其值,否則傳回 $_SERVER['SERVER_NAME']
。您可能需要查看 PHP 文件 以取得有關這些變數的更多資訊。
您可以透過設定 hostInfo 屬性來明確指定它。
警告: 依賴伺服器配置,此資訊可能不可靠,並且可能被 傳送 HTTP 請求的使用者偽造。如果 Web 伺服器配置為提供相同的站點,而與
Host
標頭的值無關,則此值不可靠。在這種情況下,您應該修復 Web 伺服器配置,或透過設定 hostInfo 屬性來明確設定該值。如果您無法存取伺服器配置,您可以在應用程式層級設定 yii\filters\HostControl 過濾器,以防止此類攻擊。
另請參閱 setHostInfo()。
public string|null getHostInfo ( ) | ||
return | string|null |
請求 URL 的 Schema 和主機名稱部分(如果需要,包含端口號)(例如 |
---|
public function getHostInfo()
{
if ($this->_hostInfo === null) {
$secure = $this->getIsSecureConnection();
$http = $secure ? 'https' : 'http';
if ($this->getSecureForwardedHeaderTrustedPart('host') !== null) {
$this->_hostInfo = $http . '://' . $this->getSecureForwardedHeaderTrustedPart('host');
} elseif ($this->headers->has('X-Forwarded-Host')) {
$this->_hostInfo = $http . '://' . trim(explode(',', $this->headers->get('X-Forwarded-Host'))[0]);
} elseif ($this->headers->has('X-Original-Host')) {
$this->_hostInfo = $http . '://' . trim(explode(',', $this->headers->get('X-Original-Host'))[0]);
} elseif ($this->headers->has('Host')) {
$this->_hostInfo = $http . '://' . $this->headers->get('Host');
} elseif (isset($_SERVER['SERVER_NAME'])) {
$this->_hostInfo = $http . '://' . $_SERVER['SERVER_NAME'];
$port = $secure ? $this->getSecurePort() : $this->getPort();
if (($port !== 80 && !$secure) || ($port !== 443 && $secure)) {
$this->_hostInfo .= ':' . $port;
}
}
}
return $this->_hostInfo;
}
傳回當前請求 URL 的主機部分。
值是從當前的 hostInfo 屬性計算而來。
警告: 此值的內容可能不可靠,具體取決於伺服器配置。請參閱 getHostInfo() 以取得更多資訊。
另請參閱 getHostInfo()。
public string|null getHostName ( ) | ||
return | string|null |
請求 URL 的主機名稱部分(例如 |
---|
public function getHostName()
{
if ($this->_hostName === null) {
$this->_hostName = parse_url((string)$this->getHostInfo(), PHP_URL_HOST);
}
return $this->_hostName;
}
建立 yii\validators\IpValidator 的實例。
您可以覆寫此方法來調整驗證器或實作不同的比對策略。
protected yii\validators\IpValidator getIpValidator ( ) |
protected function getIpValidator()
{
return new IpValidator();
}
傳回這是否為 AJAX (XMLHttpRequest) 請求。
請注意,在跨網域請求的情況下,瀏覽器預設不會設定 X-Requested-With 標頭:https://stackoverflow.com/questions/8163703/cross-domain-ajax-doesnt-send-x-requested-with-header
如果您正在使用 fetch()
,請手動傳遞標頭
fetch(url, {
method: 'GET',
headers: {'X-Requested-With': 'XMLHttpRequest'}
})
public boolean getIsAjax ( ) | ||
return | boolean |
這是否為 AJAX (XMLHttpRequest) 請求。 |
---|
public function getIsAjax()
{
return $this->headers->get('X-Requested-With') === 'XMLHttpRequest';
}
定義於: yii\base\Request::getIsConsoleRequest()
傳回一個值,指示當前請求是否透過命令列發出。
public boolean getIsConsoleRequest ( ) | ||
return | boolean |
指示當前請求是否透過主控台發出的值 |
---|
public function getIsConsoleRequest()
{
return $this->_isConsoleRequest !== null ? $this->_isConsoleRequest : PHP_SAPI === 'cli';
}
傳回這是否為 DELETE 請求。
public boolean getIsDelete ( ) | ||
return | boolean |
這是否為 DELETE 請求。 |
---|
public function getIsDelete()
{
return $this->getMethod() === 'DELETE';
}
傳回這是否為 Adobe Flash 或 Flex 請求。
public boolean getIsFlash ( ) | ||
return | boolean |
這是否為 Adobe Flash 或 Adobe Flex 請求。 |
---|
public function getIsFlash()
{
$userAgent = $this->headers->get('User-Agent', '');
return stripos($userAgent, 'Shockwave') !== false
|| stripos($userAgent, 'Flash') !== false;
}
傳回這是否為 GET 請求。
public boolean getIsGet ( ) | ||
return | boolean |
這是否為 GET 請求。 |
---|
public function getIsGet()
{
return $this->getMethod() === 'GET';
}
傳回這是否為 HEAD 請求。
public boolean getIsHead ( ) | ||
return | boolean |
這是否為 HEAD 請求。 |
---|
public function getIsHead()
{
return $this->getMethod() === 'HEAD';
}
傳回這是否為 OPTIONS 請求。
public boolean getIsOptions ( ) | ||
return | boolean |
這是否為 OPTIONS 請求。 |
---|
public function getIsOptions()
{
return $this->getMethod() === 'OPTIONS';
}
傳回這是否為 PATCH 請求。
public boolean getIsPatch ( ) | ||
return | boolean |
這是否為 PATCH 請求。 |
---|
public function getIsPatch()
{
return $this->getMethod() === 'PATCH';
}
傳回這是否為 PJAX 請求。
public boolean getIsPjax ( ) | ||
return | boolean |
是否為 PJAX 請求 |
---|
public function getIsPjax()
{
return $this->getIsAjax() && $this->headers->has('X-Pjax');
}
傳回這是否為 POST 請求。
public boolean getIsPost ( ) | ||
return | boolean |
這是否為 POST 請求。 |
---|
public function getIsPost()
{
return $this->getMethod() === 'POST';
}
傳回這是否為 PUT 請求。
public boolean getIsPut ( ) | ||
return | boolean |
這是否為 PUT 請求。 |
---|
public function getIsPut()
{
return $this->getMethod() === 'PUT';
}
傳回請求是否透過安全通道 (https) 傳送。
public boolean getIsSecureConnection ( ) | ||
return | boolean |
如果請求是透過安全通道 (https) 發送的 |
---|
public function getIsSecureConnection()
{
if (isset($_SERVER['HTTPS']) && (strcasecmp($_SERVER['HTTPS'], 'on') === 0 || $_SERVER['HTTPS'] == 1)) {
return true;
}
if (($proto = $this->getSecureForwardedHeaderTrustedPart('proto')) !== null) {
return strcasecmp($proto, 'https') === 0;
}
foreach ($this->secureProtocolHeaders as $header => $values) {
if (($headerValue = $this->headers->get($header, null)) !== null) {
foreach ($values as $value) {
if (strcasecmp($headerValue, $value) === 0) {
return true;
}
}
}
}
return false;
}
傳回當前請求的方法(例如 GET、POST、HEAD、PUT、PATCH、DELETE)。
public string getMethod ( ) | ||
return | string |
請求方法,例如 GET、POST、HEAD、PUT、PATCH、DELETE。傳回的值會轉換為大寫。 |
---|
public function getMethod()
{
if (
isset($_POST[$this->methodParam])
// Never allow to downgrade request from WRITE methods (POST, PATCH, DELETE, etc)
// to read methods (GET, HEAD, OPTIONS) for security reasons.
&& !in_array(strtoupper($_POST[$this->methodParam]), ['GET', 'HEAD', 'OPTIONS'], true)
) {
return strtoupper($_POST[$this->methodParam]);
}
if ($this->headers->has('X-Http-Method-Override')) {
return strtoupper($this->headers->get('X-Http-Method-Override'));
}
if (isset($_SERVER['REQUEST_METHOD'])) {
return strtoupper($_SERVER['REQUEST_METHOD']);
}
return 'GET';
}
傳回 CORS 請求的 URL Origin。
傳回值取自瀏覽器傳送的 Origin
標頭。
請注意,來源請求標頭指示提取的來源位置。它不包含任何路徑資訊,僅包含伺服器名稱。它與 CORS 請求以及 POST 請求一起發送。它類似於 referrer 標頭,但與此標頭不同,它不會洩露整個路徑。請參閱 https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Origin 以取得更多資訊。
另請參閱 getHeaders()。
public string|null getOrigin ( ) | ||
return | string|null |
CORS 請求的 URL Origin,如果不可用則為 |
---|
public function getOrigin()
{
return $this->getHeaders()->get('origin');
}
傳回目前請求 URL 的路徑資訊。
路徑資訊是指在入口腳本之後和問號(查詢字串)之前的部分。開頭和結尾的斜線都已移除。
public string getPathInfo ( ) | ||
return | string |
請求 URL 中在入口腳本之後和問號之前的部分。請注意,傳回的路徑資訊已經過 URL 解碼。 |
---|---|---|
throws | yii\base\InvalidConfigException |
如果由於意外的伺服器配置而無法確定路徑資訊 |
public function getPathInfo()
{
if ($this->_pathInfo === null) {
$this->_pathInfo = $this->resolvePathInfo();
}
return $this->_pathInfo;
}
public integer getPort ( ) | ||
return | integer |
不安全請求的端口號。 |
---|
public function getPort()
{
if ($this->_port === null) {
$serverPort = $this->getServerPort();
$this->_port = !$this->getIsSecureConnection() && $serverPort !== null ? $serverPort : 80;
}
return $this->_port;
}
傳回此應用程式應使用的使用者偏好語言。
語言解析基於使用者偏好的語言和應用程式支援的語言。此方法將嘗試找到最佳匹配。
public string getPreferredLanguage ( array $languages = [] ) | ||
$languages | array |
應用程式支援的語言列表。如果為空,將傳回當前應用程式語言,而無需進一步處理。 |
return | string |
應用程式應使用的語言。 |
---|
public function getPreferredLanguage(array $languages = [])
{
if (empty($languages)) {
return Yii::$app->language;
}
foreach ($this->getAcceptableLanguages() as $acceptableLanguage) {
$acceptableLanguage = str_replace('_', '-', strtolower($acceptableLanguage));
foreach ($languages as $language) {
$normalizedLanguage = str_replace('_', '-', strtolower($language));
if (
$normalizedLanguage === $acceptableLanguage // en-us==en-us
|| strpos($acceptableLanguage, $normalizedLanguage . '-') === 0 // en==en-us
|| strpos($normalizedLanguage, $acceptableLanguage . '-') === 0 // en-us==en
) {
return $language;
}
}
}
return reset($languages);
}
public mixed getQueryParam ( $name, $defaultValue = null ) | ||
$name | string |
GET 參數名稱。 |
$defaultValue | mixed |
如果 GET 參數不存在,則為預設參數值。 |
return | mixed |
GET 參數值 |
---|
public function getQueryParam($name, $defaultValue = null)
{
$params = $this->getQueryParams();
return isset($params[$name]) ? $params[$name] : $defaultValue;
}
public array getQueryParams ( ) | ||
return | array |
請求 GET 參數值。 |
---|
public function getQueryParams()
{
if ($this->_queryParams === null) {
return $_GET;
}
return $this->_queryParams;
}
傳回請求 URL 中,在問號之後的部分。
public string getQueryString ( ) | ||
return | string |
請求 URL 中問號後面的部分 |
---|
public function getQueryString()
{
return isset($_SERVER['QUERY_STRING']) ? $_SERVER['QUERY_STRING'] : '';
}
傳回原始 HTTP 請求 body。
public string getRawBody ( ) | ||
return | string |
請求主體 |
---|
public function getRawBody()
{
if ($this->_rawBody === null) {
$this->_rawBody = file_get_contents('php://input');
}
return $this->_rawBody;
}
傳回 URL Referrer。
public string|null getReferrer ( ) | ||
return | string|null |
URL 參照頁,如果不可用則為 null |
---|
public function getReferrer()
{
return $this->headers->get('Referer');
}
public string|null getRemoteHost ( ) | ||
return | string|null |
遠端主機名稱,如果不可用則為 |
---|
public function getRemoteHost()
{
return isset($_SERVER['REMOTE_HOST']) ? $_SERVER['REMOTE_HOST'] : null;
}
傳回此連線另一端的 IP。
這始終是下一個躍點,任何標頭都會被忽略。
public string|null getRemoteIP ( ) | ||
return | string|null |
遠端 IP 位址,如果不可用則為 |
---|
public function getRemoteIP()
{
return isset($_SERVER['REMOTE_ADDR']) ? $_SERVER['REMOTE_ADDR'] : null;
}
傳回入口腳本檔案路徑。
預設實作會直接回傳 $_SERVER['SCRIPT_FILENAME']
。
public string getScriptFile ( ) | ||
return | string |
入口腳本檔案路徑 |
---|---|---|
throws | yii\base\InvalidConfigException |
public function getScriptFile()
{
if (isset($this->_scriptFile)) {
return $this->_scriptFile;
}
if (isset($_SERVER['SCRIPT_FILENAME'])) {
return $_SERVER['SCRIPT_FILENAME'];
}
throw new InvalidConfigException('Unable to determine the entry script file path.');
}
傳回入口腳本的相對 URL。
此方法的實作參考了 Zend Framework 中的 Zend_Controller_Request_Http。
public string getScriptUrl ( ) | ||
return | string |
入口腳本的相對 URL。 |
---|---|---|
throws | yii\base\InvalidConfigException |
如果無法判斷入口腳本 URL |
public function getScriptUrl()
{
if ($this->_scriptUrl === null) {
$scriptFile = $this->getScriptFile();
$scriptName = basename($scriptFile);
if (isset($_SERVER['SCRIPT_NAME']) && basename($_SERVER['SCRIPT_NAME']) === $scriptName) {
$this->_scriptUrl = $_SERVER['SCRIPT_NAME'];
} elseif (isset($_SERVER['PHP_SELF']) && basename($_SERVER['PHP_SELF']) === $scriptName) {
$this->_scriptUrl = $_SERVER['PHP_SELF'];
} elseif (isset($_SERVER['ORIG_SCRIPT_NAME']) && basename($_SERVER['ORIG_SCRIPT_NAME']) === $scriptName) {
$this->_scriptUrl = $_SERVER['ORIG_SCRIPT_NAME'];
} elseif (isset($_SERVER['PHP_SELF']) && ($pos = strpos($_SERVER['PHP_SELF'], '/' . $scriptName)) !== false) {
$this->_scriptUrl = substr($_SERVER['SCRIPT_NAME'], 0, $pos) . '/' . $scriptName;
} elseif (!empty($_SERVER['DOCUMENT_ROOT']) && strpos($scriptFile, $_SERVER['DOCUMENT_ROOT']) === 0) {
$this->_scriptUrl = str_replace([$_SERVER['DOCUMENT_ROOT'], '\\'], ['', '/'], $scriptFile);
} else {
throw new InvalidConfigException('Unable to determine the entry script URL.');
}
}
return $this->_scriptUrl;
}
傳回已解碼的轉發 Header
protected array getSecureForwardedHeaderParts ( ) |
protected function getSecureForwardedHeaderParts()
{
if ($this->_secureForwardedHeaderParts !== null) {
return $this->_secureForwardedHeaderParts;
}
if (count(preg_grep('/^forwarded$/i', $this->secureHeaders)) === 0) {
return $this->_secureForwardedHeaderParts = [];
}
/*
* First header is always correct, because proxy CAN add headers
* after last one is found.
* Keep in mind that it is NOT enforced, therefore we cannot be
* sure, that this is really a first one.
*
* FPM keeps last header sent which is a bug. You need to merge
* headers together on your web server before letting FPM handle it
* @see https://bugs.php.net/bug.php?id=78844
*/
$forwarded = $this->headers->get('Forwarded', '');
if ($forwarded === '') {
return $this->_secureForwardedHeaderParts = [];
}
preg_match_all('/(?:[^",]++|"[^"]++")+/', $forwarded, $forwardedElements);
foreach ($forwardedElements[0] as $forwardedPairs) {
preg_match_all('/(?P<key>\w+)\s*=\s*(?:(?P<value>[^",;]*[^",;\s])|"(?P<value2>[^"]+)")/', $forwardedPairs, $matches, PREG_SET_ORDER);
$this->_secureForwardedHeaderParts[] = array_reduce($matches, function ($carry, $item) {
$value = $item['value'];
if (isset($item['value2']) && $item['value2'] !== '') {
$value = $item['value2'];
}
$carry[strtolower($item['key'])] = $value;
return $carry;
}, []);
}
return $this->_secureForwardedHeaderParts;
}
取得令牌的第一個 Forwarded
Header 值
protected string|null getSecureForwardedHeaderTrustedPart ( $token ) | ||
$token | string |
Header 令牌 |
protected function getSecureForwardedHeaderTrustedPart($token)
{
$token = strtolower($token);
if ($parts = $this->getSecureForwardedHeaderTrustedParts()) {
$lastElement = array_pop($parts);
if ($lastElement && isset($lastElement[$token])) {
return $lastElement[$token];
}
}
return null;
}
僅取得受信任的 Forwarded
Header 部分
protected array getSecureForwardedHeaderTrustedParts ( ) |
protected function getSecureForwardedHeaderTrustedParts()
{
if ($this->_secureForwardedHeaderTrustedParts !== null) {
return $this->_secureForwardedHeaderTrustedParts;
}
$validator = $this->getIpValidator();
$trustedHosts = [];
foreach ($this->trustedHosts as $trustedCidr => $trustedCidrOrHeaders) {
if (!is_array($trustedCidrOrHeaders)) {
$trustedCidr = $trustedCidrOrHeaders;
}
$trustedHosts[] = $trustedCidr;
}
$validator->setRanges($trustedHosts);
$this->_secureForwardedHeaderTrustedParts = array_filter(
$this->getSecureForwardedHeaderParts(),
function ($headerPart) use ($validator) {
return isset($headerPart['for']) ? !$validator->validate($headerPart['for']) : true;
}
);
return $this->_secureForwardedHeaderTrustedParts;
}
public integer getSecurePort ( ) | ||
return | integer |
安全請求的端口號。 |
---|
public function getSecurePort()
{
if ($this->_securePort === null) {
$serverPort = $this->getServerPort();
$this->_securePort = $this->getIsSecureConnection() && $serverPort !== null ? $serverPort : 443;
}
return $this->_securePort;
}
傳回伺服器名稱。
public string|null getServerName ( ) | ||
return | string|null |
伺服器名稱,如果不可用則為 null |
---|
public function getServerName()
{
return isset($_SERVER['SERVER_NAME']) ? $_SERVER['SERVER_NAME'] : null;
}
傳回伺服器端口號。如果透過轉發 Header(例如 'X-Forwarded-Port')指定了端口,且遠端主機是「受信任主機」,則將使用該端口(請參閱 $portHeaders),否則將傳回預設伺服器端口。
另請參閱 $portHeaders。
public integer|null getServerPort ( ) | ||
return | integer|null |
伺服器連接埠號碼,如果不可用則為 null |
---|
public function getServerPort()
{
foreach ($this->portHeaders as $portHeader) {
if ($this->headers->has($portHeader)) {
$port = $this->headers->get($portHeader);
if ($port !== null) {
return $port;
}
}
}
return isset($_SERVER['SERVER_PORT']) ? (int) $_SERVER['SERVER_PORT'] : null;
}
根據 $trustedHosts 的受信任 Header。
protected array getTrustedHeaders ( ) |
protected function getTrustedHeaders()
{
// do not trust any of the [[secureHeaders]] by default
$trustedHeaders = [];
// check if the client is a trusted host
if (!empty($this->trustedHosts)) {
$validator = $this->getIpValidator();
$ip = $this->getRemoteIP();
foreach ($this->trustedHosts as $cidr => $headers) {
if (!is_array($headers)) {
$cidr = $headers;
$headers = $this->secureHeaders;
}
$validator->setRanges($cidr);
if ($validator->validate($ip)) {
$trustedHeaders = $headers;
break;
}
}
}
return $trustedHeaders;
}
傳回目前請求的相對 URL。
這指的是 URL 中在 $hostInfo 部分之後的部分。它包含 $queryString 部分(如果有的話)。
public string getUrl ( ) | ||
return | string |
目前請求的相對 URL。請注意,返回的 URI 可能會根據客戶端進行 URL 編碼。 |
---|---|---|
throws | yii\base\InvalidConfigException |
如果由於不尋常的伺服器配置而無法判斷 URL |
public function getUrl()
{
if ($this->_url === null) {
$this->_url = $this->resolveRequestUri();
}
return $this->_url;
}
傳回 User Agent。
public string|null getUserAgent ( ) | ||
return | string|null |
使用者代理,如果不可用則為 null |
---|
public function getUserAgent()
{
return $this->headers->get('User-Agent');
}
傳回使用者主機名稱。
HOST 是使用 headers 和/或 $_SERVER
變數判斷的。
public string|null getUserHost ( ) | ||
return | string|null |
使用者主機名稱,如果不可用則為 null |
---|
public function getUserHost()
{
$userIp = $this->getUserIpFromIpHeaders();
if ($userIp === null) {
return $this->getRemoteHost();
}
return gethostbyaddr($userIp);
}
傳回使用者 IP 位址。
IP 是使用 headers 和/或 $_SERVER
變數判斷的。
public string|null getUserIP ( ) | ||
return | string|null |
使用者 IP 位址,如果不可用則為 null |
---|
public function getUserIP()
{
if ($this->_ip === null) {
$this->_ip = $this->getUserIpFromIpHeaders();
if ($this->_ip === null) {
$this->_ip = $this->getRemoteIP();
}
}
return $this->_ip;
}
protected string|null getUserIpFromIpHeader ( $ips ) | ||
$ips | string |
逗號分隔的 IP 清單 |
return | string|null |
字串格式的 IP。如果無法從 header 判斷 IP,則回傳 Null。 |
---|
protected function getUserIpFromIpHeader($ips)
{
$ips = trim($ips);
if ($ips === '') {
return null;
}
$ips = preg_split('/\s*,\s*/', $ips, -1, PREG_SPLIT_NO_EMPTY);
krsort($ips);
$validator = $this->getIpValidator();
$resultIp = null;
foreach ($ips as $ip) {
$validator->setRanges('any');
if (!$validator->validate($ip) /* checking IP format */) {
break;
}
$resultIp = $ip;
$isTrusted = false;
foreach ($this->trustedHosts as $trustedCidr => $trustedCidrOrHeaders) {
if (!is_array($trustedCidrOrHeaders)) {
$trustedCidr = $trustedCidrOrHeaders;
}
$validator->setRanges($trustedCidr);
if ($validator->validate($ip) /* checking trusted range */) {
$isTrusted = true;
break;
}
}
if (!$isTrusted) {
break;
}
}
return $resultIp;
}
從 $ipHeaders 傳回使用者 IP 位址。
另請參閱 $ipHeaders。
protected string|null getUserIpFromIpHeaders ( ) | ||
return | string|null |
使用者 IP 位址,如果不可用則為 null |
---|
protected function getUserIpFromIpHeaders()
{
$ip = $this->getSecureForwardedHeaderTrustedPart('for');
if (
$ip !== null && preg_match(
'/^\[?(?P<ip>(?:(?:(?:[0-9a-f]{1,4}:){1,6}(?:[0-9a-f]{1,4})?(?:(?::[0-9a-f]{1,4}){1,6}))|(?:\d{1,3}\.){3}\d{1,3}))\]?(?::(?P<port>\d+))?$/',
$ip,
$matches
)
) {
$ip = $this->getUserIpFromIpHeader($matches['ip']);
if ($ip !== null) {
return $ip;
}
}
foreach ($this->ipHeaders as $ipHeader) {
if ($this->headers->has($ipHeader)) {
$ip = $this->getUserIpFromIpHeader($this->headers->get($ipHeader));
if ($ip !== null) {
return $ip;
}
}
}
return null;
}
定義於: yii\base\Component::hasEventHandlers()
傳回一個值,指示是否有名為事件附加任何處理程序。
public boolean hasEventHandlers ( $name ) | ||
$name | string |
事件名稱 |
return | boolean |
判斷是否有任何處理器附加到事件。 |
---|
public function hasEventHandlers($name)
{
$this->ensureBehaviors();
if (!empty($this->_events[$name])) {
return true;
}
foreach ($this->_eventWildcards as $wildcard => $handlers) {
if (!empty($handlers) && StringHelper::matchWildcard($wildcard, $name)) {
return true;
}
}
return Event::hasHandlers($this, $name);
}
定義於: yii\base\Component::hasMethod()
傳回一個值,指示是否已定義方法。
如果滿足以下條件,則定義方法:
- 類別具有指定名稱的方法
- 附加的行為具有給定名稱的方法(當
$checkBehaviors
為 true 時)。
public boolean hasMethod ( $name, $checkBehaviors = true ) | ||
$name | string |
屬性名稱 |
$checkBehaviors | boolean |
是否將行為的方法視為此元件的方法 |
return | boolean |
判斷是否已定義方法 |
---|
public function hasMethod($name, $checkBehaviors = true)
{
if (method_exists($this, $name)) {
return true;
} elseif ($checkBehaviors) {
$this->ensureBehaviors();
foreach ($this->_behaviors as $behavior) {
if ($behavior->hasMethod($name)) {
return true;
}
}
}
return false;
}
定義於: yii\base\Component::hasProperty()
傳回一個值,指示是否為此組件定義了屬性。
如果滿足以下條件,則定義屬性:
- 類別具有與指定名稱關聯的 getter 或 setter 方法(在這種情況下,屬性名稱不區分大小寫);
- 類別具有具有指定名稱的成員變數(當
$checkVars
為 true 時); - 附加的行為具有給定名稱的屬性(當
$checkBehaviors
為 true 時)。
另請參閱
public boolean hasProperty ( $name, $checkVars = true, $checkBehaviors = true ) | ||
$name | string |
屬性名稱 |
$checkVars | boolean |
是否將成員變數視為屬性 |
$checkBehaviors | boolean |
是否將行為的屬性視為此元件的屬性 |
return | boolean |
判斷是否已定義屬性 |
---|
public function hasProperty($name, $checkVars = true, $checkBehaviors = true)
{
return $this->canGetProperty($name, $checkVars, $checkBehaviors) || $this->canSetProperty($name, false, $checkBehaviors);
}
public void init ( ) |
public function init()
{
}
將 $_COOKIE
轉換為 yii\web\Cookie 的陣列。
protected array loadCookies ( ) | ||
return | array |
從請求中取得的 cookies |
---|---|---|
throws | yii\base\InvalidConfigException |
如果當 $enableCookieValidation 為 true 時,$cookieValidationKey 未設定 |
protected function loadCookies()
{
$cookies = [];
if ($this->enableCookieValidation) {
if ($this->cookieValidationKey == '') {
throw new InvalidConfigException(get_class($this) . '::cookieValidationKey must be configured with a secret key.');
}
foreach ($_COOKIE as $name => $value) {
if (!is_string($value)) {
continue;
}
$data = Yii::$app->getSecurity()->validateData($value, $this->cookieValidationKey);
if ($data === false) {
continue;
}
if (defined('PHP_VERSION_ID') && PHP_VERSION_ID >= 70000) {
$data = @unserialize($data, ['allowed_classes' => false]);
} else {
$data = @unserialize($data);
}
if (is_array($data) && isset($data[0], $data[1]) && $data[0] === $name) {
$cookies[$name] = Yii::createObject([
'class' => 'yii\web\Cookie',
'name' => $name,
'value' => $data[1],
'expire' => null,
]);
}
}
} else {
foreach ($_COOKIE as $name => $value) {
$cookies[$name] = Yii::createObject([
'class' => 'yii\web\Cookie',
'name' => $name,
'value' => $value,
'expire' => null,
]);
}
}
return $cookies;
}
從 Cookie 或 Session 載入 CSRF 令牌。
protected string|null loadCsrfToken ( ) | ||
return | string|null |
從 cookie 或 session 載入的 CSRF 令牌。如果 cookie 或 session 沒有 CSRF 令牌,則回傳 Null。 |
---|
protected function loadCsrfToken()
{
if ($this->enableCsrfCookie) {
return $this->getCookies()->getValue($this->csrfParam);
}
return Yii::$app->getSession()->get($this->csrfParam);
}
定義於: yii\base\Component::off()
從此組件分離現有的事件處理程序。
此方法與 on() 相反。
注意:如果為事件名稱傳遞了萬用字元模式,則只會移除使用此萬用字元註冊的處理器,而使用符合此萬用字元的純名稱註冊的處理器將會保留。
另請參閱 on()。
public boolean off ( $name, $handler = null ) | ||
$name | string |
事件名稱 |
$handler | callable|null |
要移除的事件處理器。如果為 null,則會移除附加到指定名稱事件的所有處理器。 |
return | boolean |
如果找到並分離處理器 |
---|
public function off($name, $handler = null)
{
$this->ensureBehaviors();
if (empty($this->_events[$name]) && empty($this->_eventWildcards[$name])) {
return false;
}
if ($handler === null) {
unset($this->_events[$name], $this->_eventWildcards[$name]);
return true;
}
$removed = false;
// plain event names
if (isset($this->_events[$name])) {
foreach ($this->_events[$name] as $i => $event) {
if ($event[0] === $handler) {
unset($this->_events[$name][$i]);
$removed = true;
}
}
if ($removed) {
$this->_events[$name] = array_values($this->_events[$name]);
return true;
}
}
// wildcard event names
if (isset($this->_eventWildcards[$name])) {
foreach ($this->_eventWildcards[$name] as $i => $event) {
if ($event[0] === $handler) {
unset($this->_eventWildcards[$name][$i]);
$removed = true;
}
}
if ($removed) {
$this->_eventWildcards[$name] = array_values($this->_eventWildcards[$name]);
// remove empty wildcards to save future redundant regex checks:
if (empty($this->_eventWildcards[$name])) {
unset($this->_eventWildcards[$name]);
}
}
}
return $removed;
}
將事件處理程序附加到事件。
事件處理器必須是有效的 PHP 回呼。以下是一些範例
function ($event) { ... } // anonymous function
[$object, 'handleClick'] // $object->handleClick()
['Page', 'handleClick'] // Page::handleClick()
'handleClick' // global function handleClick()
事件處理器必須使用以下簽名定義:
function ($event)
其中 $event
是一個 yii\base\Event 物件,其中包含與事件關聯的參數。
自 2.0.14 版本起,您可以將事件名稱指定為萬用字元模式
$component->on('event.group.*', function ($event) {
Yii::trace($event->name . ' is triggered.');
});
另請參閱 off()。
public void on ( $name, $handler, $data = null, $append = true ) | ||
$name | string |
事件名稱 |
$handler | 可呼叫 (callable) |
事件處理器 |
$data | mixed |
事件觸發時要傳遞給事件處理器的資料。當調用事件處理器時,可以透過 yii\base\Event::$data 存取此資料。 |
$append | boolean |
是否將新的事件處理器附加到現有處理器列表的末尾。如果為 false,則新的處理器將插入到現有處理器列表的開頭。 |
public function on($name, $handler, $data = null, $append = true)
{
$this->ensureBehaviors();
if (strpos($name, '*') !== false) {
if ($append || empty($this->_eventWildcards[$name])) {
$this->_eventWildcards[$name][] = [$handler, $data];
} else {
array_unshift($this->_eventWildcards[$name], [$handler, $data]);
}
return;
}
if ($append || empty($this->_events[$name])) {
$this->_events[$name][] = [$handler, $data];
} else {
array_unshift($this->_events[$name], [$handler, $data]);
}
}
解析給定的 Accept
(或 Accept-Language
)Header。
此方法將傳回可接受的值,以及它們的品質分數和給定的 Accept
header 中指定的對應參數。傳回值的陣列鍵是可接受的值,而陣列值包含對應的品質分數和參數。品質分數最高的可接受值將首先傳回。例如:
$header = 'text/plain; q=0.5, application/json; version=1.0, application/xml; version=2.0;';
$accepts = $request->parseAcceptHeader($header);
print_r($accepts);
// displays:
// [
// 'application/json' => ['q' => 1, 'version' => '1.0'],
// 'application/xml' => ['q' => 1, 'version' => '2.0'],
// 'text/plain' => ['q' => 0.5],
// ]
public array parseAcceptHeader ( $header ) | ||
$header | string |
要解析的 header |
return | array |
依品質分數排序的可接受值。分數最高的值將首先傳回。 |
---|
public function parseAcceptHeader($header)
{
$accepts = [];
foreach (explode(',', $header) as $i => $part) {
$params = preg_split('/\s*;\s*/', trim($part), -1, PREG_SPLIT_NO_EMPTY);
if (empty($params)) {
continue;
}
$values = [
'q' => [$i, array_shift($params), 1],
];
foreach ($params as $param) {
if (strpos($param, '=') !== false) {
list($key, $value) = explode('=', $param, 2);
if ($key === 'q') {
$values['q'][2] = (float) $value;
} else {
$values[$key] = $value;
}
} else {
$values[] = $param;
}
}
$accepts[] = $values;
}
usort($accepts, function ($a, $b) {
$a = $a['q']; // index, name, q
$b = $b['q'];
if ($a[2] > $b[2]) {
return -1;
}
if ($a[2] < $b[2]) {
return 1;
}
if ($a[1] === $b[1]) {
return $a[0] > $b[0] ? 1 : -1;
}
if ($a[1] === '*/*') {
return 1;
}
if ($b[1] === '*/*') {
return -1;
}
$wa = $a[1][strlen($a[1]) - 1] === '*';
$wb = $b[1][strlen($b[1]) - 1] === '*';
if ($wa xor $wb) {
return $wa ? 1 : -1;
}
return $a[0] > $b[0] ? 1 : -1;
});
$result = [];
foreach ($accepts as $accept) {
$name = $accept['q'][1];
$accept['q'] = $accept['q'][2];
$result[$name] = $accept;
}
return $result;
}
傳回具有指定名稱的 POST 參數。如果未指定名稱,則傳回所有 POST 參數的陣列。
public array|mixed post ( $name = null, $defaultValue = null ) | ||
$name | string |
參數名稱 |
$defaultValue | mixed |
如果參數不存在,則為預設參數值。 |
public function post($name = null, $defaultValue = null)
{
if ($name === null) {
return $this->getBodyParams();
}
return $this->getBodyParam($name, $defaultValue);
}
將當前請求解析為路由和相關聯的參數。
public array resolve ( ) | ||
return | array |
第一個元素是路由,第二個元素是關聯的參數。 |
---|---|---|
throws | yii\web\NotFoundHttpException |
如果請求無法解析。 |
public function resolve()
{
$result = Yii::$app->getUrlManager()->parseRequest($this);
if ($result !== false) {
list($route, $params) = $result;
if ($this->_queryParams === null) {
$_GET = $params + $_GET; // preserve numeric keys
} else {
$this->_queryParams = $params + $this->_queryParams;
}
return [$route, $this->getQueryParams()];
}
throw new NotFoundHttpException(Yii::t('yii', 'Page not found.'));
}
解析目前請求 URL 的路徑資訊部分。
路徑資訊指的是在入口腳本之後和問號(查詢字串)之前的部分。開頭的斜線都會被移除(結尾的斜線會被保留)。
protected string resolvePathInfo ( ) | ||
return | string |
請求 URL 中在入口腳本之後和問號之前的部分。請注意,傳回的路徑資訊是解碼後的。 |
---|---|---|
throws | yii\base\InvalidConfigException |
如果由於意外的伺服器配置而無法確定路徑資訊 |
protected function resolvePathInfo()
{
$pathInfo = $this->getUrl();
if (($pos = strpos($pathInfo, '?')) !== false) {
$pathInfo = substr($pathInfo, 0, $pos);
}
$pathInfo = urldecode($pathInfo);
// try to encode in UTF8 if not so
// https://www.w3.org/International/questions/qa-forms-utf-8.en.html
if (
!preg_match('%^(?:
[\x09\x0A\x0D\x20-\x7E] # ASCII
| [\xC2-\xDF][\x80-\xBF] # non-overlong 2-byte
| \xE0[\xA0-\xBF][\x80-\xBF] # excluding overlongs
| [\xE1-\xEC\xEE\xEF][\x80-\xBF]{2} # straight 3-byte
| \xED[\x80-\x9F][\x80-\xBF] # excluding surrogates
| \xF0[\x90-\xBF][\x80-\xBF]{2} # planes 1-3
| [\xF1-\xF3][\x80-\xBF]{3} # planes 4-15
| \xF4[\x80-\x8F][\x80-\xBF]{2} # plane 16
)*$%xs', $pathInfo)
) {
$pathInfo = $this->utf8Encode($pathInfo);
}
$scriptUrl = $this->getScriptUrl();
$baseUrl = $this->getBaseUrl();
if (strpos($pathInfo, $scriptUrl) === 0) {
$pathInfo = substr($pathInfo, strlen($scriptUrl));
} elseif ($baseUrl === '' || strpos($pathInfo, $baseUrl) === 0) {
$pathInfo = substr($pathInfo, strlen($baseUrl));
} elseif (isset($_SERVER['PHP_SELF']) && strpos($_SERVER['PHP_SELF'], $scriptUrl) === 0) {
$pathInfo = substr($_SERVER['PHP_SELF'], strlen($scriptUrl));
} else {
throw new InvalidConfigException('Unable to determine the path info of the current request.');
}
if (strncmp($pathInfo, '/', 1) === 0) {
$pathInfo = substr($pathInfo, 1);
}
return (string) $pathInfo;
}
解析目前請求 URL 的請求 URI 部分。
這指的是在 $hostInfo 部分之後的部分。它包含 $queryString 部分(如果有的話)。此方法的實作參考了 Zend Framework 中的 Zend_Controller_Request_Http。
protected string|boolean resolveRequestUri ( ) | ||
return | string|boolean |
目前請求 URL 的請求 URI 部分。請注意,傳回的 URI 可能會根據用戶端進行 URL 編碼。 |
---|---|---|
throws | yii\base\InvalidConfigException |
如果由於不尋常的伺服器配置而無法判斷請求 URI |
protected function resolveRequestUri()
{
if ($this->headers->has('X-Rewrite-Url')) { // IIS
$requestUri = $this->headers->get('X-Rewrite-Url');
} elseif (isset($_SERVER['REQUEST_URI'])) {
$requestUri = $_SERVER['REQUEST_URI'];
if ($requestUri !== '' && $requestUri[0] !== '/') {
$requestUri = preg_replace('/^(http|https):\/\/[^\/]+/i', '', $requestUri);
}
} elseif (isset($_SERVER['ORIG_PATH_INFO'])) { // IIS 5.0 CGI
$requestUri = $_SERVER['ORIG_PATH_INFO'];
if (!empty($_SERVER['QUERY_STRING'])) {
$requestUri .= '?' . $_SERVER['QUERY_STRING'];
}
} else {
throw new InvalidConfigException('Unable to determine the request URI.');
}
return $requestUri;
}
public void setAcceptableContentTypes ( $value ) | ||
$value | array |
終端使用者可接受的內容類型。它們應該按偏好程度排序。 |
public function setAcceptableContentTypes($value)
{
$this->_contentTypes = $value;
}
public void setAcceptableLanguages ( $value ) | ||
$value | array |
終端使用者可接受的語言。它們應該按偏好程度排序。 |
public function setAcceptableLanguages($value)
{
$this->_languages = $value;
}
設定應用程式的相對 URL。
預設情況下,URL 是根據入口腳本 URL 判斷的。提供此 setter 是為了在您想要變更此行為時使用。
public void setBaseUrl ( $value ) | ||
$value | string |
應用程式的相對 URL |
public function setBaseUrl($value)
{
$this->_baseUrl = $value;
}
設定請求 body 參數。
另請參閱 getBodyParams()。
public void setBodyParams ( $values ) | ||
$values | array|object |
請求 body 參數(名稱-值 對) |
public function setBodyParams($values)
{
$this->_bodyParams = $values;
}
設定應用程式 URL 的 Schema 和主機部分。
如果某些 Web 伺服器上無法判斷 schema 和 hostname,則提供此 setter。
另請參閱 getHostInfo(),以了解有關此屬性的安全性相關注意事項。
public void setHostInfo ( $value ) | ||
$value | string|null |
應用程式 URL 的 schema 和 host 部分。結尾的斜線將被移除。 |
public function setHostInfo($value)
{
$this->_hostName = null;
$this->_hostInfo = $value === null ? null : rtrim($value, '/');
}
定義於: yii\base\Request::setIsConsoleRequest()
設定一個值,指示當前請求是否透過命令列發出。
public void setIsConsoleRequest ( $value ) | ||
$value | boolean |
指示當前請求是否透過命令列發出的值 |
public function setIsConsoleRequest($value)
{
$this->_isConsoleRequest = $value;
}
設定當前請求的路徑資訊。
此方法主要為測試目的而提供。
public void setPathInfo ( $value ) | ||
$value | string |
目前請求的路徑資訊 |
public function setPathInfo($value)
{
$this->_pathInfo = $value === null ? null : ltrim($value, '/');
}
設定用於不安全請求的端口。
提供此設定器是為了在某些伺服器配置中需要自訂埠號的情況。
public void setPort ( $value ) | ||
$value | integer |
埠號。 |
public function setPort($value)
{
if ($value != $this->_port) {
$this->_port = (int) $value;
$this->_hostInfo = null;
}
}
public void setQueryParams ( $values ) | ||
$values | array |
請求查詢參數(名稱-值 對)。 |
public function setQueryParams($values)
{
$this->_queryParams = $values;
}
設定原始 HTTP 請求 body,此方法主要由測試腳本用於模擬原始 HTTP 請求。
public void setRawBody ( $rawBody ) | ||
$rawBody | string |
請求主體 |
public function setRawBody($rawBody)
{
$this->_rawBody = $rawBody;
}
設定入口腳本檔案路徑。
通常可以從 $_SERVER['SCRIPT_FILENAME']
取得入口腳本檔案路徑。如果您的伺服器配置未傳回正確的值,您可以配置此屬性以使其正確。
public void setScriptFile ( $value ) | ||
$value | string |
入口腳本檔案路徑。 |
public function setScriptFile($value)
{
$this->_scriptFile = $value;
}
設定應用程式入口腳本的相對 URL。
提供此設定器是為了在某些 Web 伺服器上無法確定入口腳本 URL 的情況。
public void setScriptUrl ( $value ) | ||
$value | string |
應用程式入口腳本的相對 URL。 |
public function setScriptUrl($value)
{
$this->_scriptUrl = $value === null ? null : '/' . trim($value, '/');
}
設定用於安全請求的端口。
提供此設定器是為了在某些伺服器配置中需要自訂埠號的情況。
public void setSecurePort ( $value ) | ||
$value | integer |
埠號。 |
public function setSecurePort($value)
{
if ($value != $this->_securePort) {
$this->_securePort = (int) $value;
$this->_hostInfo = null;
}
}
設定目前請求的相對 URL。
URI 必須參考在 $hostInfo 之後的部分。請注意,URI 應為 URL 編碼。
public void setUrl ( $value ) | ||
$value | string |
要設定的請求 URI |
public function setUrl($value)
{
$this->_url = $value;
}
public void trigger ( $name, yii\base\Event $event = null ) | ||
$name | string |
事件名稱 |
$event | yii\base\Event|null |
事件實例。如果未設定,將會建立預設的 yii\base\Event 物件。 |
public function trigger($name, Event $event = null)
{
$this->ensureBehaviors();
$eventHandlers = [];
foreach ($this->_eventWildcards as $wildcard => $handlers) {
if (StringHelper::matchWildcard($wildcard, $name)) {
$eventHandlers[] = $handlers;
}
}
if (!empty($this->_events[$name])) {
$eventHandlers[] = $this->_events[$name];
}
if (!empty($eventHandlers)) {
$eventHandlers = call_user_func_array('array_merge', $eventHandlers);
if ($event === null) {
$event = new Event();
}
if ($event->sender === null) {
$event->sender = $this;
}
$event->handled = false;
$event->name = $name;
foreach ($eventHandlers as $handler) {
$event->data = $handler[1];
call_user_func($handler[0], $event);
// stop further handling if the event is handled
if ($event->handled) {
return;
}
}
}
// invoke class-level attached handlers
Event::trigger($this, $name, $event);
}
執行 CSRF 驗證。
此方法將透過與儲存在 Cookie 或 Session 中的 CSRF 令牌進行比較來驗證使用者提供的 CSRF 令牌。此方法主要在 yii\web\Controller::beforeAction() 中調用。
請注意,如果 $enableCsrfValidation 為 false 或 HTTP 方法為 GET、HEAD 或 OPTIONS 之一,則此方法將不會執行 CSRF 驗證。
public boolean validateCsrfToken ( $clientSuppliedToken = null ) | ||
$clientSuppliedToken | string|null |
要驗證的使用者提供的 CSRF 令牌。如果為 null,令牌將從 $csrfParam POST 欄位或 HTTP 標頭中檢索。此參數自 2.0.4 版本起可用。 |
return | boolean |
CSRF 令牌是否有效。如果 $enableCsrfValidation 為 false,此方法將傳回 true。 |
---|
public function validateCsrfToken($clientSuppliedToken = null)
{
$method = $this->getMethod();
// only validate CSRF token on non-"safe" methods https://tools.ietf.org/html/rfc2616#section-9.1.1
if (!$this->enableCsrfValidation || in_array($method, ['GET', 'HEAD', 'OPTIONS'], true)) {
return true;
}
$trueToken = $this->getCsrfToken();
if ($clientSuppliedToken !== null) {
return $this->validateCsrfTokenInternal($clientSuppliedToken, $trueToken);
}
return $this->validateCsrfTokenInternal($this->getBodyParam($this->csrfParam), $trueToken)
|| $this->validateCsrfTokenInternal($this->getCsrfTokenFromHeader(), $trueToken);
}
註冊 或 登入 以發表評論。