Ошибка 304 not modified

The HTTP 304 not modified status code indicates a communication problem between a user’s browser and a website’s server. If you or your users come across this status code on your site, it can block access to your content entirely.

Since it can be on the server-side or the client-side, figuring out the source of the problem can take a little work. Fortunately, there are several foolproof techniques for troubleshooting it.

In this post, we’ll discuss HTTP status codes and explain what the HTTP 304 status code is. Then we’ll walk you through six methods you (or your visitors) can use to fix it.

Let’s get started!

An Introduction to HTTP Status Codes

To understand HTTP 304, it helps to first understand status codes. Put simply, every time you make a request to your browser – such as by accessing a particular website – an HTTP status code is sent between your browser and the server in order to exchange information.

There are more than 40 different status codes that can be involved in that communication. However, there are only a handful you’ll likely come across directly. When you do encounter a status code, it usually means that something has gone wrong.

HTTP status codes fall into one of five categories, numbered between the 100s and 500s. Each series indicates a different type of problem. For example, error codes that fall into the 400s, such as the “404 Not Found” error and the ”401 error”, typically mean that there was an issue with the request and the website or page in question was unreachable.

On the other hand, codes in the 300s – such as the HTTP 304 status code we’ll focus on in this post – are redirection codes. They make it clear that the information being requested was either temporarily or permanently substituted with another resource.

When you encounter one of these status codes, it means that further action must be taken.

What is The HTTP 304 Status Code?

HTTP 304, also sometimes known as “304 Not Modified”, is a code that communicates to your browser that: “The requested resource has not been modified since the last time you accessed it.”

The Internet Engineering Task Force (IETF) defines the 304 Not Modified as:

The 304 (Not Modified) status code indicates that a conditional GET or HEAD request has been received and would have resulted in a 200 (OK) response if it were not for the fact that the condition evaluated to false. In other words, there is no need for the server to transfer a representation of the target resource because the request indicates that the client, which made the request conditional, already has a valid representation; the server is therefore redirecting the client to make use of that stored representation as if it were the payload of a 200 (OK) response.

Essentially, your (or your visitor’s) browser is being told by the server that the resources stored (cached) in the browser haven’t been modified since the latest time you visited that page.

In turn, your browser retrieves a saved version of the web page from the cache. The purpose of this is to improve page speed and delivery, by preventing your browser from having to repeatedly download the same information.

Check Out Our Video Guide to the 304 Not Modified Status Code and All 3xx Redirects

Understanding HTTP 304 Requests

When your browser stores a resource in the cache, it keeps what’s called the ‘Last-Modified header’ information that was sent from the server. If a browser receives a request for a web page it has a saved copy of, but it doesn’t know whether it has the latest version, it sends a ‘conditional validation’ request to the server.

The browser communicates to the server the ‘Last-Modified’ date and time for the copy of the resource it has, via the ‘If-Modified-Since’ or ‘If-None-Match’ header. The server inspects these headers and also looks at the ETag value. The latter is a unique identifier used to specify the version of a particular resource.

If the values for these files are the same, the server sends the HTTP 304 Not Modified response header and the browser uses the cached copy of the resource.

If the browser copy is outdated, meaning that the file has been modified since the last request, it sends an HTTP 200 code and a new copy is used.

Unfortunately, there are a few issues that might cause an HTTP 304 response when it’s not supposed to occur. The most common causes include:

  • Server configuration or Domain Name Server (DNS) issues
  • A cached resource that is infected or corrupted (i.e., malware or viruses affecting the browser)

The 304 status code can be due to a problem on either the server-side or the client-side, so it might take some troubleshooting in order to diagnose and resolve it.

The HTTP 304 status code can block access to all of your content which means understanding how to fix it is crucial 🚨 This guide has 6 methods to get things back up and running ASAP ✨Click to Tweet

How to Fix an HTTP 304 Status Code (6 Potential Methods)

The methods you can use to resolve an HTTP 304 status code vary from simple to fairly technical. Search engines are responsible for indexing and caching websites, so this issue can usually be traced back to the browser being used to access the site.

Of course, there’s only so much you can do to fix the browsers of people who are trying to access your site.

However, understanding what may be causing the issue for visitors can be helpful, either when trying to find a solution on your end or assisting them directly.

With that in mind, let’s take a look at six methods you can use to try and fix an HTTP 304 status code!

1. Clear the Browser’s Cache Data

First up, cleaning your browser data to clear the cache might help with accessing the desired URL. This includes deleting all of the browsing data, cookies, and cache information.

The instructions for executing this process will vary depending on the browser you’re using. If you’re unsure how to do it on your device, feel free to refer to our guide on clearing the cache for all major browsers.

2. Run a Malware Scan

Corrupted browsers that have been infected with a virus or malware may be another culprit. Therefore, it’s a good idea to run a malware scan on your system. Doing so can help identify and remove any issues that might be interrupting or interfering with the header request, including problematic extensions.

If you’re using the Windows version of Chrome, you can run the Malware Scanner and Cleanup Tool that comes built-in.

To do this, first make sure you’re running the latest version of Chrome by opening up a new tab and clicking on the menu icon, followed by About Chrome:

google chrome update

The About page of the Google Chrome browser

If your browser isn’t updated to the current version, you can resolve that in the same place. Then, open a new Chrome tab and enter “chrome://settings/cleanup” into the URL bar.

Hit Enter, and then next to Find and remove harmful software click on the Find button:

clean up computer

The cleanup tool in Google Chrome

The scanner will begin running, then report back with the results.

Unfortunately, some other browsers such as Firefox and Edge, as well as the macOS and Linux OSs, do not come with their own versions of this built-in tool. Instead, you’ll have to run a malware scan using the antivirus software on your computer.

3. Disable Your Browser’s Extensions

Your browser’s extensions may also become infected and interfere with requests and server communication. That’s why you may also want to disable them. You can do this by opening Chrome’s menu and going to Settings > Extensions:

chrome settings extensions

The Extensions menu item in Chrome’s settings

On the Extensions page, you can disable each one by clicking on the corresponding toggle switch.

You can also delete unused or outdated extensions via the Remove button:

chrome extensions

The Extensions page in Google Chrome

Again, this process will vary slightly depending on your browser. The goal is to remove or disable each extension manually and then check to see if that resolves the HTTP 304 issue.

Then, you can try turning them back on one by one.

4. Flush the DNS and Reset the TCP/IP

If the problem hasn’t been resolved at this point, there could be an issue with the DNS settings. For example, using an outdated IP address might cause an HTTP 304 status code.

Therefore, another approach to try is flushing the DNS and resetting the TCP/IP.

With Chrome, you can flush the browser DNS by entering “chrome://net-internals/#dns” into a new tab.

Hit Enter, and then click on the Clear host cache button:

clear host cache

The settings page for flushing the DNS cache in Chrome

You can also flush the DNS and reset the TCP/IP in your OS. If you need detailed guidance, you can refer to our tutorial on How to Flush DNS Cache (Windows, Mac, Chrome).

5. Try Using the Google Public DNS

Another potential cause is an incorrect DNS address. Therefore, it’s worth using the Google Public DNS to see if that resolves the problem.

On Windows, you can do this by pressing the Win + R keys. In the Run window that appears, type “ncpa.cpl” into the command box, and then hit Ok.

In the Network Connections window that opens next, locate the network connection you’re using and right-click on it. Next, select Properties:

network connection properties

The Network Connections settings page in Windows

From there, double-click on Internet Protocol Version 4:

internet protocol version

The Wi-Fi Properties settings in Windows

Select the option to “Use the following DNS server addresses”, then enter the value “8.8.8.8” under Preferred and “8.8.4.4” under Alternate:

dns server addresses

The fields to input preferred and alternate DNS server addresses in Windows

When you’re done, click on Ok. Then restart your system, and try accessing the website again.

To change your DNS server settings using macOS, you would go to Apple > System Preferences > Network:

System Preferences in macOS

System Preferences in macOS

In the window that opens, select your connection, then click on Advanced followed by the DNS tab:

The Network DNS panel in macOS

The Network DNS panel in macOS

Click the + icon next to the IPv4 or IPv6 addresses, to replace the existing addresses with the Google Public IPs.

For further instructions or for guidance on using Google Public DNS on a Linux or another OS, check out Google’s own DNS guide.

6. Check Your Server Configuration Files for Incorrect Redirect Instructions

An HTTP 304 Not Modified status code can occur due to both server- and client-related problems. If none of the methods we’ve covered so far have corrected the issue, your server configuration files may be at fault. For example, it’s possible that there are incorrect redirect instructions present.

The process for checking your server configuration files depends on whether you’re using Nginx or Apache.

At Kinsta, we use the Nginx web server. So if you’re a Kinsta user, you won’t have access to the .htaccess file that Apache users do.

However, you can still perform similar functions. For example, after logging in to MyKinsta, you can check the Analytics > Response section of the dashboard for a breakdown of response codes and redirects:

Screenshot: Response code breakdown in MyKinsta.

An example of response code breakdown in MyKinsta.

You can also check the error logs. If you have a specific question or request about editing the configuration files, your best bet is to reach out to our support team.

If your server is running on Apache, then you’ll want to look for the .htaccess file in the root directory of your site. You can do this by logging into the File Manager for your hosting account, and navigating to the public_html folder.

Once you open that file, look for a mod_cache module section. It should look something like this:

LoadModule cache_module modules/mod_cache.so
<IfModule mod_cache.c>
    LoadModule cache_disk_module modules/mod_cache_disk.so
    <IfModule mod_cache_disk.c>
        CacheRoot "c:/cacheroot"
        CacheEnable disk  "/"
        CacheDirLevels 5
        CacheDirLength 3
    </IfModule>

    # When acting as a proxy, don't cache the list of security updates
    CacheDisable "http://security.update.server/update-list/"
</IfModule>

We don’t recommend deleting anything, as that can cause severe damage. Instead, you can try temporarily commenting out the cache section by adding a “#” symbol at the beginning of each line.

After you save your changes, check to see if this resolved the HTTP 304 status code.

Don’t let an HTTP 304 status code stand in the way of your site ❌ Find all the troubleshooting tricks you need in this in-depth guideClick to Tweet

Summary

300s redirection codes are used to improve page speed and performance. Unfortunately, when a server or browser isn’t properly configured, communication between the two can get interrupted and result in an HTTP 304 not modified status code. There are six methods you can use to fix it, specifically:

  1. Clearing your browser’s cache data.
  2. Running a malware scan.
  3. Disabling your browser extensions.
  4. Flushing the DNS and resetting the TCI/IP.
  5. Trying the Google Public DNS.
  6. Checking your server configuration files for incorrect redirect instructions.

The other night I was searching «Best Pasta Dish Recipes» on Google.

http-304-not-modified

I clicked the first link and was stopped by the dreaded error code.

I’m willing to bet something similar has happened to you, at one point or another.

When that happens, it’s not just my brain experiencing technical difficulties.

These error codes are HTTP status codes. If you receive an error code, something went wrong when your browser requested the information from a web server. An HTTP status code is sent every time you go to a new web page. However, you’ll only see them if something isn’t right.

For marketers, it’s important to discover and fix these issues so your website visitors don’t have a negative experience.

Below, let’s review what an HTTP 304 not modified status code is, and what’s causing it.

Improve your website with effective technical SEO. Start by conducting this  audit. 

An HTTP 304 not modified status code means that the website you’re requesting hasn’t been updated since the last time you accessed it. Typically, your browser will save (or cache) web pages so it doesn’t have to repeatedly download the same information. This is an attempt to speed up page delivery. However, if this happens to your site, visitors could be prevented from accessing your web pages.

When you click on a web page or URL, your browser requests access to it from a web server. If it has not been modified since the last time you accessed it, the web server will send back a 304 not modified status code, which lets your browser know to use a cached version of the web page.

Usually, you’ll only see this error code if you’re on a search engine because search engines index and cache websites.

If your browser receives this code, it’ll try to show you a saved version of the page. But sometimes it might prevent you from accessing the URL because it’s outdated.

As a marketer, you could lose out on traffic and leads if visitors are prevented from seeing your site.

So, what causes a 304 not modified code?

Causes of an HTTP 304 Not Modified Status Code

If a user sees a 304 not modified status code on your site, there isn’t much you can do. This is because the problem is most likely on their side of the screen.

Users could receive a 304 not modified status code for a variety of reasons:

1. You have a virus.

If you have a virus or malware on your computer, it most likely has corrupted your browser. This could impact your browser’s ability to communicate with web servers and cache web pages.

2. You’ve recently installed or uninstalled software.

Sometimes when you install or uninstall software on your computer, the registry could become corrupt. Again, this impacts your browser.

3. An application has corrupted files.

If there are corrupted files related to your internet browser, it will impact its ability to save web pages and update information.

How to Fix a 304 Not Modified Status Code

Although marketers can’t do much if a user sees a 304 not modified status code, users can try a few things to get the web page to show up on their browser.

1. Clear browsing data.

Clearing your browsing data will make sure your cache is cleared so it can try to access the URL you’re requesting.

To clear your browsing data, go to your History and then click «Clear browsing data.» In Chrome, it looks like this:

How to clear browsing data on Google Chrome.

Once you click that, make sure you check off all three options. Then, you’ll want to change the time frame to «All Time.» It should look like this:

Clearing cached images and files on Google Chrome.

2. Run cleaners to get rid of viruses and malware.

A 304 not modified code could be happening because your browser is corrupted with a virus or malware. Run a check to make sure that isn’t the issue and clean up your computer.

3. Disable extensions.

There could be something wrong with your extensions. For example, they could be corrupt, which impacts your browser’s ability to receive information. Disable your extensions to see if this is the issue.

If these things don’t work, fixing a 304 not modified can be a more technical process. You might consider asking a web developer or someone in IT to take a look.

If you receive an HTTP 304 not modified error code, it’s because the URL you requested has outdated information. To fix it, you’ll want to double-check that the error isn’t on your side — the client’s — but instead on the server-side.

Improve your website with effective technical SEO. Start by conducting this  audit.  

HTTP response status code 304 Not Modified is returned by the server to indicate a successful HTTP request, yet there is no need to send the data associated with the relevant resource. Essentially, it is the same as a 200 OK status code with a specific header included. There is no message body for this response code.

Usage

The 304 Not Modified status code is sent by the server in a limited number of cases. It implies that the HTTP request is safe, such as a GET or HEAD HTTP request, and the server concludes that the resource has not been changed since it was last stored in the client’s cache. This is intended as a bandwidth-conserving function, as the server does not have to retransmit data that the client already has.

The server must generate one of the following HTTP headers in response to what was sent by the client:

  • Cache-Control
  • Content-Location
  • Date
  • ETag
  • Expires
  • Vary

Because the goal of the 304 Not Modified HTTP response is to minimize bandwidth, the server will not generate redundant or unused HTTP headers. Therefore, none of the above fields will be returned that were not included in the HTTP request, unless it is otherwise helpful for the cache-update process.

If the HTTP request was conditional, such as a conditional GET, and it included an appropriate directive, then the server may return 304 Not Modified status code. The relevant directives are If-None-Match and If-Modified-Since, and rely on a header such as ETag to evaluate the necessity to transmit the resource.

Example

In the example, the client requests a resource that is stored in the cache after it is received. The ETag transmitted by the server uniquely identifies the version sent by the server. Sometime later, a second HTTP request is made by the client to see if anything has changed. The client transmits the ETag that it had originally received, and the server recognizes that nothing has changed since the last transmission. Consequently, it returns the 304 Not Modified status code. Finally, the client makes a third HTTP request and by that time, a new version of the document is available. As such, a new copy is transmitted by the server with the newest ETag.

Note

Each time the server updates a resource, it generates a new ETag and maintains a history of the previous ones. This server-side version history, in conjunction with the client’s local cache, together are what make this bandwidth-conserving option possible. Alternatively, the server might return a Last-Modified date, and the client can use that instead of the ETag in If-Modified-Since, negating the need for the server to maintain a history of ETag values.

Initial request

GET /news.html HTTP/1.1
Host: www.example.re

Initial response

HTTP/1.1 200 OK
Etag: “1234 … 000"
Content-Type: text/html
Content-Length: 1250

<message body contains requested resource>

Second request

GET /news.html HTTP/1.1
Host: www.example.re
If-None-Match: “1234 … 000"

Second response

HTTP/1.1 304 Not Modified
Etag: “1234 … 000"

Third request

GET /news.html HTTP/1.1
Host: www.example.re
If-None-Match: “1234 … 000"

Third response

HTTP/1.1 200 OK
Etag: “1234 … 001"
Content-Type: text/html
Content-Length: 1600

<message body contains requested resource>

Code references

.NET

HttpStatusCode.NotModified

Rust

http::StatusCode::NOT_MODIFIED

Rails

:not_modified

Go

http.StatusNotModified

Symfony

Response::HTTP_NOT_MODIFIED

Python3.5+

http.HTTPStatus.NOT_MODIFIED

Java

java.net.HttpURLConnection.HTTP_NOT_MODIFIED

Apache HttpComponents Core

org.apache.hc.core5.http.HttpStatus.SC_NOT_MODIFIED

Angular

@angular/common/http/HttpStatusCode.NotModified

Takeaway

The 304 Not Modified status code indicates that the HTTP request was successful but because the client has the most recent version already cached locally, the server opts to conserve bandwidth and respond to say that there is no reason to retransmit the requested resource.

See also

  • 200 OK
  • If-Modified-Since
  • If-None-Match
  • RFC 7231

Last updated: August 2, 2023

Код ошибки 304 является одним из многих кодов состояния, которые указывают на проблему связи между браузером пользователя и сервером веб-сайта. Эта ошибка на веб-портале может привести к полной блокировке доступа к контенту. Статья поможет разобраться, что такое ошибка HTTP 304 (Not Modified), какие сбои она может вызывать в работе компьютера. Также здесь указано пошаговое руководство по избавлению от ошибки 304.

ошибки 304

О чем говорит ошибка 304?

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

Почему возникает ошибка 304?

Пользователь может получить ошибку «304 неизмененный код состояния» по разным причинам:

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

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

Что делать, когда возникает ошибка 304?

Методы, которые можно использовать для устранения ошибки, варьируются от простых до технически сложных. Поисковые системы отвечают за индексацию и кеширование веб-страниц, поэтому эту проблему обычно можно проследить до браузера, используемого для доступа к веб-странице. Коды перенаправления HTTP 304 используются для повышения скорости и производительности страницы. К сожалению, если сервер или браузер настроены неправильно, связь между ними может быть нарушена, что приведет к ошибке HTTP 304.

Методы, которые можно использовать для устранения ошибки 304:

Проверяем правильность ссылки на страницу

Часто ошибка появляется из-за того, что URL-адрес был введен неправильно. Поэтому необходимо проверить правильность введенной строки, если она известна, исправить опечатки и попытаться перейти снова. Если ошибка все же остается, можно использовать быстрый поиск в Google или Yandex, возможно, он приведет на нужную страницу.

Чистим кэш браузера

Очистка данных кеша может помочь получить доступ к нужному URL-адресу. Инструкции по выполнению этого процесса различаются в зависимости от используемого браузера.

Очистить кеша браузера для Google Chrome:

  1. Нажать на значок трех точек в правом верхнем углу окна браузера.
  2. Войти в параметры «Дополнительные инструменты».
  3. Выбрать «Очистить данные просмотра» в подменю.

Очистить кеш браузера для Google Chrome

Очистка кеша браузера для Mozilla Firefox:

  1. Нажать значок гамбургера в правом верхнем углу.
  2. Выбрать «История».
  3. В меню шелкнуть «Очистить недавнюю историю».
  4. В списке «Диапазон времени для очистки» выбрать «Все».
  5. Установить флажок Кэш, чтобы не удалять важные данные просмотра.
  6. Нажать «Очистить сейчас».

Очистить кеш браузера для Mozilla Firefox

Очистка кеша браузера для Safari:

  1. Включить меню «Разработка».
  2. Выбрать «Настройки», далее «Дополнительно».
  3. Отметить «Показать меню разработки в строке меню».
  4. Перейти в «Разработка».
  5. Очистить кеш.

Очистить кеш браузера для Safari

Как очистить кеш браузера для Internet Explorer:

  1. Щелкнуть значок шестеренки в правом верхнем углу, чтобы открыть меню «Инструменты».
  2. Найти «Безопасность».
  3. Выбрать только временные файлы интернета и файлы веб-сайтов, чтобы не удалять важную информацию.
  4. Нажать кнопку «Удалить».

Очистить кеш браузера для Internet Explorer

Очистка кеш браузера для Microsoft Edge:

  1. Нажать значок с тремя точками в правом верхнем углу окна браузера.
  2. Щелкнуть «Выбрать, что очистить».
  3. Выбрать только поле «Кэшированные данные и файлы», чтобы не удалять важную информацию.

Очистить кеш браузера для Microsoft Edge

Как очистить кеш браузера для Opera:

  • Щелкнуть значок Operа в верхнем левом углу.
  • Найти параметр «Дополнительные инструменты».
  • Выбрать «Очистить данные просмотра» в подменю.

Очистить кеш браузера для Opera

Выключаем расширения

Расширения браузера также могут быть заражены и нарушать отправку запросов или вмешиваться в связь с сервером. В этом случае можно отключить их. Для этого необходимо:

  1. Открыть меню Chrome
  2. Выбрать «Настройки», далее «Расширения».
  3. Деактивировать каждое из них, щелкнув соответствующий тумблер.

Также можно удалить неиспользуемые или устаревшие расширения, нажав кнопку «Удалить». Этот процесс будет немного отличаться в зависимости от браузера. Цель состоит в том, чтобы вручную удалить или отключить каждое расширение, а затем посмотреть, решит ли это проблему HTTP 304. Дальше можно попробовать включить их по одному.

Сбрасываем данные кэша DNS

Если проблема не решилась с помощью предыдущих пунктов, то, возможно, она связана с настройками DNS. Например, использование устаревшего IP-адреса может вызвать ошибку HTTP 304. Еще один способ попробовать — очистить DNS и сбросить TCP/IP.

В Chrome можно очистить DNS браузера:

  1. Ввести «chrome: //net-internals/#dns» в новой вкладке.
  2. Нажать Enter.
  3. Затем кнопку Clear Host Cache.

Также можно очистить DNS и сбросить TCP / IP в своей операционной системе. Другая возможная причина ошибки — неправильный адрес DNS. Поэтому стоит использовать Google Public DNS, чтобы посмотреть, решит ли он проблему.

В Windows можно сделать это так:

  1. Нажать Win + R клавиши.
  2. В Run окне, которое появляется, требуется ввести «ncpa.cpl» в поле команды.
  3. Нажать кнопку OK.
  4. В следующем  открывшемся окне «Сетевые подключения» найти используемое подключение и щелкнуть на него правой кнопкой мыши.
  5. Выбрать «Свойства», оттуда дважды щелкнуть «Internet Protocol Version 4».
  6. Кликнуть на вариант «Использовать следующие адреса DNS-серверов».
  7. Ввести значение «8.8.8.8.8» в разделе «Предпочтительный» и 8.8.4.4 в графу «Альтернативный».
  8. Нажать ОК.
  9. Далее требуется перезагрузить систему и попробовать снова получить доступ к веб-сайту.

Чтобы изменить настройки DNS-сервера в macOS, нужно:

  • Перейти в Apple.
  • Выбрать «Системные настройки».
  • Нажать «Сеть».
  • В открывшемся окне выбрать свое подключение.
  • Нажать «Дополнительно».
  • Выбрать DNS.
  • Нужно щелкнуть символ + рядом с адресами IPv4 или IPv6, чтобы заменить существующие адреса общедоступными IP-адресами Google.

Для получения дополнительных инструкций или совета по использованию Google Public DNS в Linux или другой операционной системе лучше ознакомиться с собственным руководством Google по DNS.

Ошибка 304 Not Modified может возникать как из-за проблем, связанных с сервером, так и с клиентом. Если ни один из методов, рассмотренных ранее, не помог решить проблему, возможно, файлы конфигурации сервера пользователя повреждены или имеется неверная информация о переадресации. Ошибка сервера может заблокировать доступ ко всему контенту, а это значит, что понимание того, как ее исправить, имеет большое значение. В этом руководстве представлены причины и методы, которые позволяют как можно быстрее вернуть все в норму.

Any ideas why on some links that I try to access using HttpWebRequest I am getting «The remote server returned an error: (304) Not Modified.» in the code?

The code I’m using is from Jeff’s post here (the page seems to have disappeared, see an archive copy at the Wayback Machine).

Note the concept of the code is a simple proxy server, so I’m pointing my browser at this locally running piece of code, which gets my browsers request, and then proxies it on by creating a new HttpWebRequest, as you’ll see in the code. It works great for most sites/links, but for some this error comes up. You will see one key bit in the code is where it seems to copy the http header settings from the browser request to it’s request out to the site, and it copies in the header attributes. Not sure if the issue is something to do with how it mimics this aspect of the request and then what happens as the result comes back?

case "If-Modified-Since":
   request.IfModifiedSince = DateTime.Parse(listenerContext.Request.Headers[key]);
   break;

I get the issue for example from http://en.wikipedia.org/wiki/Main_Page

PS. UPDATE HERE

Still can’t work this out. Basically I can identify 1 link which has an issue, and it seems to work fine, 2nd time it gets the error, 3rd time OK, 4th time gets the error, 5th time OK etc. As if there is some state not getting cleared or something in the code. I’ve tried to clean up the code a bit using «using» type statements etc.

Here’s the code. If anyone can spot why every 2nd time I browse to a link like http://newsimg.bbc.co.uk/css/screen/1_0_16/nol/v4/story.css (starting at the 2nd time, not the first) via this proxy code I get the error I’d love to hear.

class Program
{
    static void Main(string[] args)
    {
        Proxy p = new Proxy(8080);

        Thread proxythread = new Thread(new ThreadStart(p.Start));
        proxythread.Start();

        Console.WriteLine("Proxy Started. Press Any Key To Stop...");
        Console.ReadKey();

        p.Stop();
     }
}

public class Proxy
{
    private HttpListener _listener;
    private int _port;

    public Proxy(int port)
    {
        int defaultport = 8080;

        // Setup Thread Pool
        System.Threading.ThreadPool.SetMaxThreads(50, 1000);
        System.Threading.ThreadPool.SetMinThreads(50, 50);

        // Sanitize Port Number
        if (port < 1024 || port > 65535)
            port = defaultport;

        // Create HttpListener Prefix
        string prefix = string.Format("http://*:{0}/", port);
        _port = port;

        // Create HttpListener
        _listener = new HttpListener();
        _listener.Prefixes.Add(prefix);
    }

    public void Start()
    {
        _listener.Start();

        while (true)
        {
            HttpListenerContext request = null;

            try
            {
                request = _listener.GetContext();

                // Statistics (by Greg)
                int availThreads = -1;
                int compPortThreads = -1;
                ThreadPool.GetAvailableThreads(out availThreads, out compPortThreads);
                log("INFO", request.Request.Url.ToString(), "START - [" + availThreads + "]");

                ThreadPool.QueueUserWorkItem(ProcessRequest, request);
            }
            catch (HttpListenerException ex)
            {
                log("ERROR", "NA", "INFO: HttpListenerException - " + ex.Message);
                break;
            }
            catch (InvalidOperationException ex)
            {
                log("ERROR", "NA", "INFO: InvalidOperationException - " + ex.Message);
                break;
            }
        }
    }

    public void Stop()
    {
        _listener.Stop();
    }

    private void log(string sev, string uri, string message)
    {
        Console.Out.WriteLine(Process.GetCurrentProcess().Id + " - " + sev + " (" + uri + "): " + message);
    }

    private void ProcessRequest(object _listenerContext)
    {
        #region local variables
        HttpWebRequest psRequest;                   // Request to send to remote web server
        HttpWebResponse psResponse;                 // Response from remote web server         
        List<byte> requestBody = new List<byte>();  // Byte array to hold the request's body
        List<byte> responseBody = new List<byte>(); // Byte array to hold the response's body
        byte[] buffer;
        string uri = "";
        #endregion

        var listenerContext = (HttpListenerContext)_listenerContext;
        uri = listenerContext.Request.Url.ToString().Replace(string.Format(":{0}", _port), "");

        // Create Interent Request 
        HttpWebRequest internetRequest = (HttpWebRequest)WebRequest.Create(uri);
        #region Build Request Up
        internetRequest.Method = listenerContext.Request.HttpMethod;
        internetRequest.ProtocolVersion = listenerContext.Request.ProtocolVersion;
        internetRequest.UserAgent = listenerContext.Request.UserAgent;
        foreach (string key in listenerContext.Request.Headers.AllKeys)
        {
            try
            {
                switch (key)
                {
                    case "Proxy-Connection":
                    case "Connection":
                        internetRequest.KeepAlive = (listenerContext.Request.Headers[key].ToLower() == "keep-alive") ? true : false;
                        break;

                    case "Content-Length":
                        internetRequest.ContentLength = listenerContext.Request.ContentLength64;
                        break;

                    case "Content-Type":
                        internetRequest.ContentType = listenerContext.Request.ContentType;
                        break;

                    case "Accept":
                        internetRequest.Accept = listenerContext.Request.Headers[key];
                        break;

                    case "Host":
                        break;

                    case "Referer":
                        internetRequest.Referer = listenerContext.Request.Headers[key];
                        break;

                    case "If-Modified-Since":
                        internetRequest.IfModifiedSince = DateTime.Parse(listenerContext.Request.Headers[key]);
                        break;

                    default:
                        internetRequest.Headers.Add(key, listenerContext.Request.Headers[key]);
                        break;
                }
            }
            catch (Exception ex)
            {
                Console.WriteLine("Error settup up psRequest object. Error = " + ex.Message + "\n" + ex.StackTrace);
            }
        }
        #endregion

        #region Copy content into request
        buffer = new byte[1024];
        using (Stream instream = listenerContext.Request.InputStream)
        {
            int incount = instream.Read(buffer, 0, buffer.Length);
            while (incount > 0)
            {
                internetRequest.GetRequestStream().Write(buffer, 0, incount);
                incount = instream.Read(buffer, 0, buffer.Length);
            }
        }
        #endregion

        // Get Internet Response
        HttpWebResponse internetResponse = null;
        try
        {
            using (internetResponse = (HttpWebResponse)internetRequest.GetResponse())
            {
                #region Configure Local Response Header Keys
                foreach (string key in internetResponse.Headers.Keys)
                {
                    try
                    {
                        switch (key)
                        {
                            case "Transfer-Encoding":
                                listenerContext.Response.SendChunked = (internetResponse.Headers[key].ToLower() == "chunked") ? true : false;
                                break;

                            case "Content-Length":
                                listenerContext.Response.ContentLength64 = internetResponse.ContentLength;
                                break;

                            case "Content-Type":
                                listenerContext.Response.ContentType = internetResponse.Headers[key];
                                break;

                            case "Keep-Alive":
                                listenerContext.Response.KeepAlive = true;
                                break;

                            default:
                                listenerContext.Response.Headers.Add(key, internetResponse.Headers[key]);
                                break;
                        }
                    }
                    catch (Exception ex)
                    {
                        log("ERROR", uri, "Error settup up listenerContext.Response objects. Error = " + ex.Message + "\n" + ex.StackTrace);
                    }
                }
                #endregion

                try
                {
                    // Transfer the body data from Internet Response to Internal Response
                    buffer = new byte[1024];
                    using (Stream inputStream = internetResponse.GetResponseStream())
                    {
                        int outcount = inputStream.Read(buffer, 0, buffer.Length);
                        while (outcount > 0)
                        {
                            listenerContext.Response.OutputStream.Write(buffer, 0, outcount);
                            outcount = inputStream.Read(buffer, 0, buffer.Length);
                        }
                    }
                }
                catch (Exception ex)
                {
                    log("ERROR", uri, "Could not obtain response from URI: " + ex.Message);
                }
                finally
                {
                    listenerContext.Response.OutputStream.Close();
                }
            }
        }
        catch (Exception ex)
        {
            //if (ex is InvalidOperationException ||
            //    ex is ProtocolViolationException ||
            //    ex is WebException)
            //{
            //    log(uri, "Could not successfully get response: " + ex.GetType() + " - " + ex.Message);
            //    listenerContext.Response.Close();
            //    return;
            //}
            //else { throw; }

            log("ERROR", uri, "Could not successfully get response: " + ex.GetType() + " - " + ex.Message);
            listenerContext.Response.Close();
        }
    }
}

And here is an example of what I see — first hit is good, 2nd has error…

Proxy Started. Press Any Key To Stop...
2080 - INFO (http://newsimg.bbc.co.uk:8080/css/screen/1_0_16/nol/v4/story.css): START - [50]
2080 - INFO (http://newsimg.bbc.co.uk:8080/css/screen/1_0_16/nol/v4/story.css): START - [50]
2080 - ERROR (http://newsimg.bbc.co.uk/css/screen/1_0_16/nol/v4/story.css): Could not successfully get response: System.Net.WebException - The remote server returned an error: (304) Not Modified.

Понравилась статья? Поделить с друзьями:
  • Ошибка 304 flask
  • Ошибка 303 ваз 2110
  • Ошибка 304 css
  • Ошибка 3025 сбер мегамаркет
  • Ошибка 3036 windows 7