我们看到了一些非常奇怪的 HTTP 响应修改,我们无法弄清楚这是怎么回事。我们有一个处理 JSON 请求的应用服务器。有时,响应以 gzip 格式返回,但包含不正确的标头,导致浏览器无法正确解释它。
这个问题是间歇性的,随着时间的推移会改变行为。昨天早上它似乎有 50% 的时间失败,事实上,它似乎与我们的两台负载平衡服务器之一有关。下午晚些时候,它在 1000 次中只有 20 次失败,并且与应用服务器无关。
这两个应用程序服务器运行 Apache 2.2,带有 mod_wsgi 和一个 Django 应用程序堆栈。它们具有相同的 Apache 配置和源代码树,甚至在 Red Hat 上安装了相同的软件包。前面有一个硬件负载均衡器,我不知道品牌或型号。
Akamai 也是食物链的一部分,尽管我们移除了 Akamai,但问题仍然存在。
这是一个很好的请求和响应:
* Connected to example.com (97.7.79.129) port 80 (#0)
> POST /claim/ HTTP/1.1
> User-Agent: curl/7.19.7 (x86_64-pc-linux-gnu) libcurl/7.19.7 OpenSSL/0.9.8k zlib/1.2.3.3 libidn/1.15
> Host: example.com
> Accept: */*
> Referer: http://example.com/apps/
> Accept-Encoding: gzip,deflate
> Content-Length: 29
> Content-Type: application/x-www-form-urlencoded
>
} [data not shown]
< HTTP/1.1 200 OK
< Server: Apache/2 …Run Code Online (Sandbox Code Playgroud) 当我取消设置Last-Modified在Apache的头(ETags也被禁止),火狐(4.01),将不缓存任何文件,无论我是否设定一个未来的Expires页眉或启用Cache-Control头。
那么浏览器缓存需要Last-Modified(和/或ETag)标头吗?
从这里:
如果响应中没有验证器(ETag 或 Last-Modified 标头),并且它没有任何明确的新鲜度信息,它将被视为不可缓存。
...好吧,如果“新鲜度信息”是指“Cache-Control”或“Expires”标头,那么 Firefox 应该在没有 Last-Modified 标头的情况下进行缓存。
编辑更多 Firefox 信息
请注意,在 Firefox 4.01 中由 Apache 2.2 提供的任何 PHP 文件上生成 304 的任何尝试都不会成功(重新加载、重新访问等)而没有Last-Modified标头,无论设置了有效缓存Cache-Control标头、Expires标头或两者的任何组合标题。
foo.php:这个文件的内容只是简单地回应“Hello World”。
HTTP/1.1 200 OK
Date: Mon, 06 Jun 2011 14:04:58 GMT
Server: Apache
Cache-Control: public, max-age=3600
Expires: Fri, 01 Jul 2011 21:23:55 GMT
Vary: Accept-Encoding
Content-Encoding: gzip
Content-Length: 1594
Keep-Alive: …Run Code Online (Sandbox Code Playgroud) 我使用 Squid 来修改客户端发送的一些 HTTP 标头。出于测试目的,我想完全删除“User-Agent”标头。
这是我的配置:
request_header_access User-Agent deny all
header_replace User-Agent Timmy
logformat mylogformat %>a [%{%H:%M}tl] "%rm %ru HTTP/%rv" %>Hs "Accept:%{Accept}>ha User-Agent:%{User-Agent}>ha" {%Ss:%Sh}
Run Code Online (Sandbox Code Playgroud)
我使用语法 '>ha' 来记录“适配和重定向后的 HTTP 请求标头”,正如这里所说的http://www.squid-cache.org/Versions/v3/3.1/cfgman/logformat.html
不幸的是,根据我的日志文件 access.log,标题没有被修改:
x.x.x.x [19:18] "GET http://example.org/favicon.ico HTTP/1.1" 404 "Accept:text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 User-Agent:Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:10.0.2) Gecko/20100101 Firefox/10.0.2" {TCP_MISS:DIRECT}`
Run Code Online (Sandbox Code Playgroud)
但是,当通过代理向我的 Nginx 服务器发出请求时,Nginx 有效地正确记录了此标头:
[06/Mar/2012:19:18:07 +0100] "GET /sites/all/modules/colorbox/styles/default/images/controls.png HTTP/1.1" 200 2104 "http://example.org/sites/default/files/css/css_zpYGaC6A9wUNMpW3IPg55mz-mMAjvhuo-SZTcX-lqFQ.css" "Timmy"
Run Code Online (Sandbox Code Playgroud)
在鱿鱼日志文件上记录正确修改的 HTTP 标头、重写的 url 等的正确语法是什么?
我的鱿鱼版本是 2.7.STABLE9,它在 Debian SQueeze 64 位上运行。
谢谢你的帮助
我想允许我的用户仅为我的域登录 Google 应用程序。我通过添加此 Google 帮助页面中X-GoogApps-Allowed-Domains所述的 HTTP 标头找到了解决方案。
我使用 Squid,但不知道如何配置 Squid 来执行此操作。如何使用 Squid 添加此请求标头?
我的设置:
我的问题:
我正在尝试完全屏蔽为页面提供服务的软件(部分是安全性,主要是因为它很有趣),我设法更改了服务器名称并删除了X-Powered-Byphp-fastcgi 添加的标题,但是我无法删除三个标题:
Client-Date: Thu, 14 Jun 2012 20:32:34 GMT
Client-Peer: 205.186.146.37:80
Client-Response-Num: 1
Run Code Online (Sandbox Code Playgroud)
我已经more_clear_headers从 HttpHeadersMore 模块中使用过,但是尽管能够删除X-Powered-By标题,但没有任何效果。
这是在我的http街区
more_set_headers "Server: Tesco Value";
more_clear_headers "X-Powered-By";
more_clear_headers "Client-*";
more_clear_headers "Client-Date";
more_clear_headers "Client-Response-Num";
more_clear_headers "Client-Peer";
more_clear_headers "X-Pingback";
add_header X-Required-Volume-Setting 11;
add_header X-Required-Speed 88mph;
# NEW: added in thanks to the answer from @kworr - but still doesn't work …Run Code Online (Sandbox Code Playgroud) 我有一个基于图像的网站,其中包含多个画廊。当用户单击其中一个图像时views,特定图像的属性会增加。但是,我注意到在使用 Firefox (14.0.0.1) 时它会增加两次视图,而不那么复杂的浏览器(例如 K-meleon)会增加一次属性 - 应该如此。
然后有人在 stackoverflow 上指出,这可能是由于现代浏览器中的预取导致 PHP 脚本从数据库中获取图像并增加要执行两次的视图。因此,检查我的 apache access.log 我注意到 Firefox 确实请求每个图像两次:
Firefox/14.0.1" ::1 - - [03/Aug/2012:16:41:37 +0100] "GET /imgsite/getImg.php?id=23 HTTP/1.1" 200 57362 " http://localhost /imgsite/index.php " "Mozilla/5.0 (Windows NT 6.1; rv:14.0) Gecko/20100101 Firefox/14.0.1" ::1 - - [03/Aug/2012:16:41:37 +0100] " GET /imgsite/getImg.php?id=23 HTTP/1.1" 200 57362 "-" "Mozilla/5.0 (Windows NT 6.1; rv:14.0) Gecko/20100101 Firefox/14.0.1"
然后我阅读了 .htaccess 并尝试了几种阻止 Firefox(或 chrome)发送的预取标头的方法,但这些标头不应该出现在上面的代码段中吗?到目前为止,一切都没有奏效。这是我的 .htaccess 文件,它位于我网站的根 HTML 路径中:
RewriteEngine On
RewriteCond %{HTTP:X-moz} prefetch
RewriteRule . . [F,L]
Run Code Online (Sandbox Code Playgroud)
我已经尝试了上述其他更广泛的变体,但仍然无济于事。我的 apache …
我正在尝试仅为locationnginx 中的特定块设置一些标头。
我遇到的问题是这些location块包含rewrite语句,显然似乎删除了自定义标题。
在这个例子中,我有两个我想要的规则:
/static应该有expires max;(它设置标题Cache-Control: max-age=some huge value和Expires: some future date really far off),并将它们的名字重写为不包含的内容/staticCache-Control: public(没有max-age)这是我尝试的配置:
server {
listen [::]:80;
root /somepath;
location /static {
expires max;
rewrite /static(.*) /whatever$1;
}
add_header Cache-Control public;
}
Run Code Online (Sandbox Code Playgroud)
并具有以下目录结构:
/somepath
/somepath/f1.txt
/somepath/static/f2.txt
Run Code Online (Sandbox Code Playgroud)
然后我们得到以下信息:
f1.txt: Cache-Control: public, 没有Expires标题f2.txt: Cache-Control: public, 没有Expires标题这对f1.txt但无效 …
我将我的一个旧站点从 Apache 移到了 nginx 服务器。一切正常,但该站点有一些长内容(+100k 生成的 HTML 文件)。
我的第一次尝试是禁用分块传输编码,但这并没有帮助。
这是我的 nginx 配置:
$ cat /etc/nginx/nginx.conf
user www-data;
worker_processes 1;
error_log /var/log/nginx/error.log;
pid /var/run/nginx.pid;
events {
worker_connections 1024;
}
http {
include /etc/nginx/mime.types;
sendfile on;
keepalive_timeout 65;
tcp_nodelay on;
gzip on;
gzip_static on;
gzip_http_version 1.0;
gzip_disable "MSIE [1-6]\.";
gzip_vary on;
gzip_comp_level 1;
gzip_proxied any;
gzip_types text/plain text/css application/json application/x-javascript text/xml application/xml application/xml+rss text/javascript application/javascript text/x-js;
gzip_buffers 16 8k;
include /etc/nginx/conf.d/*.conf;
include /etc/nginx/sites-enabled/*;
}
$ cat /etc/nginx/sites-enabled/example.com
server {
listen 443 ssl; …Run Code Online (Sandbox Code Playgroud) 请注意,由于网络安全相关问题,我无法在负载平衡器上使用 SSL 终止。
我得到的客户端 IP 当然是负载均衡器的 IP。我知道负载平衡器在没有我的密钥的情况下无法修改 HTTPS 消息,但是在使用 SSL 进行负载平衡时是否有另一种方法来获取客户端 IP 地址,例如可能只是在 TCP 级别进行负载平衡,或者其他什么?
我有一个只能通过 POST 方法访问的文件。
/var/www/folder/index.php
Run Code Online (Sandbox Code Playgroud)
文档根是/var/www/和index.php嵌套在文件夹内。
Apache 的版本是:2.4.4。
我的配置如下:
<Directory "/var/www/folder">
<Files "index.php">
order deny,allow
Allow from all
<LimitExcept POST>
Deny from all
</LimitExcept>
</Files>
</Directory>
Run Code Online (Sandbox Code Playgroud)
我访问我的服务器,127.0.0.1/folder但我可以像往常一样获取和发布文件。
我也试过颠倒顺序order allow,deny、、要求、限制除外和限制。
如何只允许一个文件夹中的一个文件处理 POST 请求?
http-headers ×10
http ×4
nginx ×3
apache-2.2 ×2
squid ×2
.htaccess ×1
application ×1
cache ×1
google ×1
gzip ×1
httpd.conf ×1
php ×1
ssl ×1