Как получить авторизацию в заголовке с nginx? [Дубликат]

Добавление случая, когда имя класса для объекта, используемого в структуре сущности, такое же, как имя класса для файла с кодировкой веб-формы.

Предположим, у вас есть веб-форма Contact.aspx, чей класс codebehind Свяжитесь с вами, и у вас есть имя объекта Contact.

Затем следующий код вызовет исключение NullReferenceException при вызове context.SaveChanges ()

Contact contact = new Contact { Name = "Abhinav"};
var context = new DataContext();
context.Contacts.Add(contact);
context.SaveChanges(); // NullReferenceException at this line

Ради полноты класса DataContext

public class DataContext : DbContext 
{
    public DbSet Contacts {get; set;}
}

и класс сущности контакта. Иногда классы сущностей являются частичными классами, так что вы можете распространять их и в других файлах.

public partial class Contact 
{
    public string Name {get; set;}
}

Ошибка возникает, когда оба класса entity и codebehind находятся в одном и том же пространстве имен. Чтобы исправить это, переименуйте класс сущности или класс codebehind для Contact.aspx.

Причина. Я все еще не уверен в причине. Но всякий раз, когда какой-либо из классов сущностей расширяет System.Web.UI.Page, возникает эта ошибка.

Для обсуждения рассмотрим NullReferenceException в DbContext.saveChanges ()

30
задан Rob 26 May 2010 в 20:47
поделиться

5 ответов

Из docs перед выпуском PHP 5.4.0:

Эта функция поддерживается только в том случае, если PHP установлен как модуль Apache.

PHP 5.4.0 и более поздние версии поддерживают эту функцию безоговорочно.

Указанные документы также включают функции замещения, которые имитируют функциональные возможности apache_request_headers, путем перехода через $_SERVER.

26
ответ дан duskwuff 26 August 2018 в 03:03
поделиться
  • 1
    current docs все еще упоминают, что функции apache_*() доступны только при запуске PHP в качестве модуля Apache. В конкретном документе для apache_request_headers() говорится, что он теперь (& gt; = 5.4.0) доступен в FastCGI, но я сомневаюсь, что он доступен безоговорочно , например, в IIS. – Benjamin 27 June 2014 в 14:41

Вы можете использовать следующую функцию замены:

<?php
if( !function_exists('apache_request_headers') ) {
///
function apache_request_headers() {
  $arh = array();
  $rx_http = '/\AHTTP_/';
  foreach($_SERVER as $key => $val) {
    if( preg_match($rx_http, $key) ) {
      $arh_key = preg_replace($rx_http, '', $key);
      $rx_matches = array();
      // do some nasty string manipulations to restore the original letter case
      // this should work in most cases
      $rx_matches = explode('_', $arh_key);
      if( count($rx_matches) > 0 and strlen($arh_key) > 2 ) {
        foreach($rx_matches as $ak_key => $ak_val) $rx_matches[$ak_key] = ucfirst($ak_val);
        $arh_key = implode('-', $rx_matches);
      }
      $arh[$arh_key] = $val;
    }
  }
  return( $arh );
}
///
}
///
?>

Источник: Руководство по PHP

51
ответ дан Babatunde Adeyemi 26 August 2018 в 03:03
поделиться
  • 1
    хорошо работает! – Zabs 5 November 2012 в 18:23
  • 2
    Я использовал эту функцию на своем сайте, но, похоже, работает медленно, есть ли способы ускорить ее работу? – Zabs 6 November 2012 в 13:30
  • 3
    @Zabs: Да, вы можете настроить $arh как статическую переменную в этой функции, чтобы убедиться, что она выполняется только один раз. [Д0] Пример – machineaddict 2 October 2013 в 10:20
  • 4
    Вам нужно создать первый символ в верхнем регистре, измените его: $ rx_matches [$ ak_key] = ucfirst ($ ak_val); Кому: $ rx_matches [$ ak_key] = ucfirst (strtolower ($ ak_val)); – Awena 16 August 2014 в 05:36
  • 5
    Я не могу получить заголовок авторизации, если эта функция – adrian4aes 24 April 2015 в 22:10

, если php установлен как модуль Apache:

apache_request_headers()["Authorization"];

else, перейдите в файл .htaccess и добавьте:

SetEnvIf Authorization "(.*)" HTTP_AUTHORIZATION=$1

Затем вы можете получить доступ к заголовкам запроса, используя любые из них:

$_SERVER["HTTP_AUTHORIZATION"]; // using super global

ИЛИ

$app->request->headers("Authorization"); // if using PHP Slim
12
ответ дан Chanakya Vadla 26 August 2018 в 03:03
поделиться

Как было предложено в , другой ответ здесь , я использовал функцию из комментариев в документации PHP , но обнаружил, что она субоптимальна, трудно читается / поддерживается, и не полностью по сравнению с (несоответствующим) корпусом некоторых заголовков.

Так как мне нужно действительно быть в состоянии полагаться на него, я переписал его, чтобы быть более очевидным и лучше обрабатывать больше краевых дел - исходный код даже утверждает «сделать некоторые неприятные манипуляции с строками, чтобы восстановить исходный регистр букв» и «это должно работать в большинстве случаев» , который не звучит хорошо для чего-то, от которого вы должны быть в состоянии.

Это не идеально, но я считаю, что он более надежный. Единственное, чего ему не хватает, - это работать с фактическими или оригинальными заголовками, так как любые изменения $_SERVER будут отражены в выходе. Это можно смягчить, сделав результат статическим и запустив функцию в первую очередь для каждого запроса.

<?php
// Drop-in replacement for apache_request_headers() when it's not available
if(!function_exists('apache_request_headers')) {
    function apache_request_headers() {

        // Based on: http://www.iana.org/assignments/message-headers/message-headers.xml#perm-headers
        $arrCasedHeaders = array(
            // HTTP
            'Dasl'             => 'DASL',
            'Dav'              => 'DAV',
            'Etag'             => 'ETag',
            'Mime-Version'     => 'MIME-Version',
            'Slug'             => 'SLUG',
            'Te'               => 'TE',
            'Www-Authenticate' => 'WWW-Authenticate',
            // MIME
            'Content-Md5'      => 'Content-MD5',
            'Content-Id'       => 'Content-ID',
            'Content-Features' => 'Content-features',
        );
        $arrHttpHeaders = array();

        foreach($_SERVER as $strKey => $mixValue) {
            if('HTTP_' !== substr($strKey, 0, 5)) {
                continue;
            }

            $strHeaderKey = strtolower(substr($strKey, 5));

            if(0 < substr_count($strHeaderKey, '_')) {
                $arrHeaderKey = explode('_', $strHeaderKey);
                $arrHeaderKey = array_map('ucfirst', $arrHeaderKey);
                $strHeaderKey = implode('-', $arrHeaderKey);
            }
            else {
                $strHeaderKey = ucfirst($strHeaderKey);
            }

            if(array_key_exists($strHeaderKey, $arrCasedHeaders)) {
                $strHeaderKey = $arrCasedHeaders[$strHeaderKey];
            }

            $arrHttpHeaders[$strHeaderKey] = $mixValue;
        }

        return $arrHttpHeaders;

    }
}
1
ответ дан Community 26 August 2018 в 03:03
поделиться

То же самое случилось со мной при использовании «apache_request_headers ()», поэтому я использовал этот код - отлично работает для вывода всех заголовков:

<?php

    $headers = array();

    foreach($_SERVER as $key => $value) {
        if(strpos($key, 'HTTP_') === 0) {
            $headers = str_replace(' ', '-', ucwords(str_replace('_', ' ', strtolower(substr($key, 5)))));
            echo $headers." : ". $i[$headers] = $value . "<br>";
        }
    }

?>

Пример вывода:

Accept : text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Encoding : gzip, deflate
Accept-Language : en-US,en;q=0.5
Cache-Control : max-age=0
Connection : keep-alive
Host : example.com
Referer : https://example.com/
User-Agent : Mozilla/5.0 (Windows NT 6.1; WOW64; rv:35.0) Gecko/20100101 Firefox/35.0
3
ответ дан sputn1k 26 August 2018 в 03:03
поделиться
  • 1
    Я не могу получить заголовок авторизации, если эта функция – adrian4aes 24 April 2015 в 22:15
  • 2
    Почему вы присваиваете значение $ i [$ headers], прежде чем повторять его? – Doug McLean 19 January 2018 в 13:21
  • 3
    он работает для меня, спасибо..и поймать с if ($ i [$ headers] == & quot; Авторизация & quot;) { – Bye Webster 5 March 2018 в 07:35
Другие вопросы по тегам:

Похожие вопросы: