Остановка установки файлов cookie из домена (он же «домен без файлов cookie») для повышения производительности сайта - PullRequest
23 голосов
/ 17 июня 2010

Я читал в документацию Google об улучшении скорости сайта.Одной из их рекомендаций является предоставление статического контента (изображений, CSS, JS и т. Д.) Из «домена без файлов cookie»:

Статический контент, такой как изображения, файлы JS и CSS, не требуется.сопровождаться файлами cookie, поскольку пользователь не взаимодействует с этими ресурсами.Вы можете уменьшить задержку запроса, обслуживая статические ресурсы из домена, который не обслуживает файлы cookie.

Google тогда говорит, что лучший способ сделать это - купить новый домен и установить для него указатель наВаш текущий:

Чтобы зарезервировать домен без файлов cookie для обслуживания статического содержимого, зарегистрируйте новое доменное имя и настройте базу данных DNS с записью CNAME, которая указывает новый домен на существующую запись домена А.Настройте веб-сервер для обслуживания статических ресурсов из нового домена и не разрешайте установку файлов cookie в этом домене.На ваших веб-страницах укажите имя домена в URL для статических ресурсов.

Это довольно прямолинейный материал, за исключением части, где говорится " настроить ваш веб-сервер наобслуживать статические ресурсы из нового домена и не разрешать установку файлов cookie в этом домене". Из того, что я прочитал , в IIS нет настройки, позволяющей сказать "обслуживать статические ресурсы", так как я могу запретить ASP.NET устанавливать файлы cookie в этом новом домене?

В настоящее время, даже если я просто запрашиваю .jpg из нового домена, он устанавливает cookie в моем браузере, даже если файлы cookie нашего приложения настроены на наш старый домен.Например, ASP.NET устанавливает «.ASPXANONYMOUS» cookie, который (насколько я знаю) мы не советуем делать.

Извиняюсь, если это действительно новый вопрос, яНовое в этом!

Спасибо.

Ответы [ 4 ]

24 голосов
/ 30 января 2011

Вот как я сделал на своем сайте:

  1. Настройка веб-сайта на IIS с пулом приложений ASP.NET
  2. Установите узел привязки на your.domain.com
    • Примечание: вы не можете использовать domain.com, иначе субдомен не останется без cookie
  3. Создать на сайте папку с именем Static
  4. Настройте другой веб-сайт, укажите на папку Static, созданную ранее.
  5. Установите узел привязки на static.domain.com
  6. Использование пула приложений с неуправляемым кодом
  7. В настройках откройте Session State и отметьте Not enabled.

Теперь у вас есть статический веб-сайт. Для настройки откройте файл web.config в папке Static и замените его следующим:

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
  <system.web>
    <sessionState mode="Off" />
    <pages enableSessionState="false" validateRequest="false" />
    <roleManager>
      <providers>
        <remove name="AspNetWindowsTokenRoleProvider" />
      </providers>
    </roleManager>
  </system.web>
  <system.webServer>
    <staticContent>
      <clientCache cacheControlMode="UseMaxAge" cacheControlMaxAge="30.00:00:00" />
    </staticContent>
    <httpProtocol>
      <customHeaders>
        <remove name="X-Powered-By" />
      </customHeaders>
    </httpProtocol>
  </system.webServer>
</configuration>

Это будет кэшировать файлы в течение 30 дней, удалить RoleManager (я не знаю, если он что-то изменит, но я удалил все, что смог найти) и удалить элемент из заголовков ответа.

Но здесь есть проблема, ваш контент будет кэшироваться даже при развертывании новой версии, поэтому во избежание этого я сделал вспомогательный метод для MVC. По сути, вам нужно добавить некоторую строку QueryString, которая будет меняться при каждом изменении этих файлов.

default.css?v=1   ?v=2  ...

Мой метод MVC получает дату последней записи и добавляет к файлу URL:

public static string GetContent(this UrlHelper url, string link)
{
    link = link.ToLower();

    // last write date ticks to hex
    var cacheBreaker = Convert.ToString(File.GetLastWriteTimeUtc(url.RequestContext.HttpContext.Request.MapPath(link)).Ticks, 16);

    // static folder is in the website folders, but instead of
    // www.domain.com/static/default.css I convert to
    // static.domain.com/default.css
    if (link.StartsWith("~/static", StringComparison.InvariantCultureIgnoreCase))
    {
        var host = url.RequestContext.HttpContext.Request.Url.Host;
        host = String.Format("static.{0}", host.Substring(host.IndexOf('.') + 1));

        link = String.Format("http://{0}/{1}", host, link.Substring(9));

        // returns the file URL in static domain
        return String.Format("{0}?v={1}", link, cacheBreaker);
    }

    // returns file url in normal domain
    return String.Format("{0}?v={1}", url.Content(link), cacheBreaker);
}

И использовать его (MVC3 Razor):

<link href="@Url.GetContent("~/static/default.css")" rel="stylesheet" type="text/css" />

Если вы используете приложение другого типа, вы можете сделать то же самое, создайте метод для добавления HtmlLink на страницу.

16 голосов
/ 17 июня 2010

Если вы не пишете куки с домена, домен будет без куки.

Когда домен настроен на размещение только содержимого ресурса, такого как сценарии, изображения и т. Д., Они запрашиваются обычными HTTP-GET-запросами от браузеров. Это содержимое должно быть подано как есть. Это сделает ваш домен без файлов cookie. Это невозможно сделать с помощью конфигурации веб-сервера. Http полностью не имеет состояния, и веб-серверы вообще не имеют представления о файлах cookie. Куки пишутся или отправляются клиентам через серверные скрипты. Лучшее, что вы можете сделать, это отключить возможности сценариев asp.net, classic-asp или php в приложении IIS.

То, как мы это делаем.

У нас есть настройка поддомена для обслуживания ресурсов без файлов cookie. Таким образом, мы размещаем все наши изображения и сценарии в поддомене. и из основного приложения мы просто указываем ресурс по его URL. Мы гарантируем, что субдомен остается свободным от cookie, не обслуживая динамический скрипт в этом домене или создавая какие-либо сессии asp.net или php.

http://cf.mydomain.com/resources/images/*.images
http://cf.mydomain.com/resources/scripts/*.scripts
http://cf.mydomain.com/resources/styles/*.styles

из основного домена мы просто ссылаемся на ресурс следующим образом.

<img src="http://cf.mydomain.com/resources/images/logo.png" />
2 голосов
/ 23 марта 2011

Обслуживание ресурсов из доменов без Cookie - это отличная техника, если у вас есть более 5 комбинированных изображений / styleshees / javascript, тогда это преимущество заметно и выигрывает даже при таком дополнительном поиске DNS. Также его очень легко реализовать :). Вот как вы можете легко установить его в web.config [system.web] и иметь субдомен без файлов cookie (если только он не поддерживается Google Analytics, но это также легко излечимо):)

<!-- anonymousIdentification configuration:
                    enabled="[true|false]"                              Feature is enabled?
                    cookieName=".ASPXANONYMOUS"                         Cookie Name
                    cookieTimeout="100000"                              Cookie Timeout in minutes
                    cookiePath="/"                                      Cookie Path
                    cookieRequireSSL="[true|false]"                     Set Secure bit in Cookie
                    cookieSlidingExpiration="[true|false]"              Reissue expiring cookies?
                    cookieProtection="[None|Validation|Encryption|All]" How to protect cookies from being read/tampered
                    domain="[domain]"                                   Enables output of the "domain" cookie attribute set to the specified value
                -->

Чтобы дать вам пример

<anonymousIdentification enabled="true" cookieName=".ASPXANONYMOUS" cookieTimeout="100000" cookiePath="/" cookieRequireSSL="false" cookieSlidingExpiration="true" cookieProtection="None" domain="www.domain." />

Это установит файл cookie .ASPXANONYMOUS только на www.domain.anyTLD, но не на myStatic.domain.anyTLD ... нет необходимости создавать новые пулы и прочее:).

0 голосов
/ 31 августа 2010

Если вы не используете этот файл cookie, вы можете просто отключить состояние сеанса в IIS 6: http://support.microsoft.com/kb/244465

В IIS перейдите на вкладку «Домашний каталог», затем нажмите кнопку «Конфигурация».

Далее перейдите на вкладку «Параметры» и снимите флажок «Включить состояние сеанса». Файл cookie исчезнет, ​​и вы сможете оставить свои файлы там, где они находятся, без необходимости в дополнительном домене или дополнительном домене.

Кроме того, используя дополнительные домены, вы увеличиваете количество просмотров DNS, что частично противоречит цели общей оптимизации.

...