我有一个ASP.NET(MVC)网站,它提供静态内容(图像)以及来自同一域的动态内容.该站点使用表单身份验证,并具有登录控制器.人们发现自己随机登录或退出时出现了一些非常奇怪/不正常的问题,我们已经将其跟踪到一个问题,反向代理缓存了一个图像文件,该文件具有设置cookie响应标头身份验证cookie.一旦缓存,每个人都会得到相同的auth cookie,这会产生一些非常奇怪的结果.
我的问题是 - 图像如何首先得到一个固定的cookie标题?什么是ASP.NET表单身份验证模块正在做的事情 - 当然它在主HTML内容响应上设置cookie.我得到的是,然后将auth cookie与所有后续请求一起发送到域,但我无法弄清楚cookie是如何设置的.
(顺便说一句,这个问题也可能是至少两个现有大型电子商务网站的罪魁祸首,这些网站遇到类似问题,没有解决方案,因此这将是一个很好的解决方案).
响应如下所示(取自小提琴手).
HTTP/1.1 200 OK
Cache-Control: public, max-age=86400,max-age=86400
Content-Type: image/png
Last-Modified: Thu, 04 Nov 2010 16:00:52 GMT
Accept-Ranges: bytes
ETag: "0528474397ccb1:0"
Server: Microsoft-IIS/7.5
Set-Cookie: my-auth-cookie=6BC25F1EF71989466A48C0120E7739E; path=/; HttpOnly
Date: Wed, 17 Nov 2010 17:15:08 GMT
Content-Length: 15790
Run Code Online (Sandbox Code Playgroud)
更新:其他信息 - 我们在Win2008 R2,64位上使用IIS 7.5,该应用程序在使用集成管道/ .net 4的应用程序池下运行.
更新2:我不是在寻找问题的解决方案,我们已经有了解决方案.我正在寻找这个问题的答案,这就是为什么它首先发生的原因?请不要回答告诉我子域名或cookie如何工作!
更新3:添加请求:
GET https://www.example.com/sprite.png HTTP/1.1
Host: www.example.com
Connection: keep-alive
Cache-Control: no-cache
Pragma: no-cache
Accept: application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/534.7 (KHTML, like Gecko) Chrome/7.0.517.44 Safari/534.7 …
Run Code Online (Sandbox Code Playgroud) 我有一个很大程度上依赖于系统环境变量的本地开发环境(它遵循Heroku 12-factor app模型),我目前使用shell脚本设置它们.shell脚本还设置了git遥控器,并激活了virtualenv环境,如果可能的话,我希望将所有这些移动到Fabric命令(或一系列命令),因为我们使用Fabric来处理其他一些东西,我想退出shell脚本.
运行local('export FOO=bar')
不起作用:
$ fab set_default_env_vars
Using fabfile '/home/hugo/Projects/test/fabfile.py'
[localhost] local: export FOO=bar
Done.
$ echo $FOO
$
Run Code Online (Sandbox Code Playgroud)
这可能 - 如果是的话,怎么样?
我有一个相当标准的设置与nginx前面的django应用程序.我希望django应用程序只是SSL,所以我的nginx conf中有两个监听块,端口80(HTTP)上的流量被重定向到端口443(SSL).这是按预期工作的.
我在启用了端口转发的VM中运行此设置,以便我可以通过转到端口8080(HTTP)或8081(SSL)从主机浏览该站点.再次,这工作正常,如预期的那样.
当我在注册工作流程中从Django应用程序内部重定向时,问题就出现了.因为Django从未看到SSL状态(SSL在nginx处终止,并且应用程序的流量通过HTTP在端口5000上转发),但确实看到了端口,重定向正在被破坏**.
所有这一切的最终结果是我将流量引导到SSL端口上的nginx,即不是SSL,例如http://127.0.0.1:443/
.有没有办法配置nginx来处理这个?
**NB我在Nginx中设置了X-Forwarded-Proto标头,而Django正在获取正确的.is_secure()值,这是一个特定的问题,外部库没有检查is_secure,只是重定向传入的URL方案.
[更新1]
附件是相关的配置设置.这是来自Vagrantfile本身,显示端口转发:
config.vm.forward_port 80, 8080 # website, via nginx (redirects to SSL:8081)
config.vm.forward_port 443, 8081 # website, via nginx (accepts SSL)
config.vm.forward_port 5000, 8180 # website, via gunicorn (direct)
Run Code Online (Sandbox Code Playgroud)
使用上述端口转发配置,如果我在HTTP端口(8080)上浏览到主机上的站点,则接受请求,并且nginx(见下文)将此请求重定向到HTTPS(在端口8081上运行).一旦我使用HTTPS,网站本身就可以正常工作:
(host) http://127.0.0.1:8080 -> forwarded to -> (guest vm) http://127.0.0.1:80
(host) https://127.0.0.1:8081 -> forwarded to -> (guest vm) https://127.0.0.1:443
Run Code Online (Sandbox Code Playgroud)
当我从Django内部获得一个混合方案和协议的重定向,并最终得到一个请求http:\\127.0.0.1:8081\...
失败,因为nginx期望8081上的流量是SSL时,会出现问题.
我真正想要的是一条规则,即"在443上监听SSL和非SSL以及重定向非SSL".
这是相关的nginx配置:
# Django app is served by Gunicorn, running under port 5000 (via Foreman)
upstream gunicorn {
server 127.0.0.1:5000 fail_timeout=0; …
Run Code Online (Sandbox Code Playgroud) 我有一个使用Vagrant设置的VM,其上运行Postgres(在端口5432上),转发到主机上的端口8280.
我已经为默认用户设置了密码,我可以在本地连接就好了.
我一直试图通过端口8280从主机设置访问权限,而我一直无法使用'MD5'作为信任方法.
我已经开始postgresql.conf
收听所有地址:
# postgresql.conf
listen_addresses = '*'
Run Code Online (Sandbox Code Playgroud)
我配置pg_hab.conf
如下:
# pg_hab.conf
#TYPE DATABASE USER CIDR-ADDRESS METHOD
host all all 0.0.0.0/0 md5
Run Code Online (Sandbox Code Playgroud)
使用所有这些设置,如果我从主机运行以下命令:
psql --host=127.0.0.1 --port=8280 --username=postgres -d mydb -c '\l'
Run Code Online (Sandbox Code Playgroud)
我被提示输入密码,然后我得到:
psql: FATAL: password authentication failed for user "postgres"
Run Code Online (Sandbox Code Playgroud)
如果我然后将METHOD从'md5'更改为'trust',我就不会要求输入密码,我可以按预期连接.我的问题是 - 为什么我不能使用'md5'连接,这是我想要做的?我知道我输入的密码是正确的(我已经更改了),但由于某种原因它无法正常工作.
我有运行在Mac OSX(10.8.2)上的virtualenv,虽然它可以工作(我可以设置venvs,在它们之间切换,激活和deactvate),一件不起作用(并且非常烦人)的是终端提示切换.
我的基本提示是[\u] \w \n\[\033[0;31m\]$\[\e[0m\]
,它呈现为:
[hugo] /current/directory/path/
$
Run Code Online (Sandbox Code Playgroud)
即它有一个换行符.
如果我激活virtualenv,我会期望:
(myproject)[hugo] /current/directory/path/
$
Run Code Online (Sandbox Code Playgroud)
但实际上我根本没有变化.
我打开了/bin/activate
脚本,看了看代码:
if [ -z "$VIRTUAL_ENV_DISABLE_PROMPT" ] ; then
_OLD_VIRTUAL_PS1="$PS1"
if [ "x" != x ] ; then
PS1="$PS1"
else
if [ "`basename \"$VIRTUAL_ENV\"`" = "__" ] ; then
# special case for Aspen magic directories
# see http://www.zetadev.com/software/aspen/
PS1="[`basename \`dirname \"$VIRTUAL_ENV\"\``] $PS1"
else
PS1="(`basename \"$VIRTUAL_ENV\"`)$PS1"
fi
fi
export PS1
fi
Run Code Online (Sandbox Code Playgroud)
如果我在最后粘贴一个回声,我可以看到PS1
var设置为(myproject)[\u] \w \n\[\033[0;31m\]$\[\e[0m\]
,但由于某些原因没有粘连,并且没有输出正确的PS1.
这与我的自定义提示或权限问题有关吗?它显然不是一个虚拟的东西,因为我知道它有效(事实上它适用于我的流浪汉VM,而不是我的OSX主机).
?
[更新1] …
我花了20分钟调试一些(django)单元测试.我正在测试一个视图POST,我期待一个302返回代码,之后我断言了一堆数据库实体正如预期的那样.原来最近合并的提交添加了一个新的表单字段,我的测试失败了,因为我没有包含正确的表单数据.
问题是测试失败了,因为HTTP返回代码是200而不是302,我只能通过打印响应HTTP并查看它来解决问题.除了必须通过HTML来解决问题的烦恼之外,200似乎是一个没有得到处理的POST的错误代码.4xx(客户端错误)似乎更合适.此外,它会使测试变得简单,因为响应代码会直接指出我的问题.
我已经读过使用422(不可处理的实体)作为REST API中可能的返回代码,但是在HTML视图/处理程序中找不到任何使用它的证据.
我的问题是 - 是否有其他人这样做,如果没有,为什么不呢?
[ 更新1 ]
只是为了澄清,这个问题与HTML表单有关,而不是API.
这也是关于HTTP响应代码本身的问题 - 而不是Django.这恰好就是我正在使用的东西.我删除了django标签.
[ 更新2 ]
W3C参考文献进一步澄清(http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html):
10.2成功2xx
此类状态代码表示已成功接收,理解和接受客户端的请求.
10.4客户端错误4xx
4xx类状态代码适用于客户端似乎有错误的情况.
10.4.1 400错误请求
由于语法格式错误,服务器无法理解请求.
来自https://tools.ietf.org/html/rfc4918#page-78
11.2. 422不可处理的实体
422(不可处理实体)状态代码表示服务器理解请求实体的内容类型(因此415(不支持的媒体类型)状态代码是不合适的),并且请求实体的语法是正确的(因此400(错误请求) )状态代码不合适)但无法处理包含的指令.例如,如果XML请求主体包含格式正确(即语法正确)但语义错误的XML指令,则可能发生此错误情况.
[ 更新3 ]
深入研究,422是WebDAV扩展[1],这可能解释其默默无闻.也就是说,由于Twitter为了自己的目的使用420,我想我会满足于我想要的任何东西.但它将以4开头.
[ 更新4 ]
关于使用自定义响应代码的说明,以及如何处理它们(如果无法识别),来自HTTP 1.1规范(http://tools.ietf.org/html/rfc2616#section-6.1.1):
HTTP状态代码是可扩展的.HTTP应用程序不需要理解所有已注册状态代码的含义,尽管这种理解显然是可取的.但是,应用程序必须理解任何状态代码的类,如第一个数字所示,并将任何无法识别的响应视为等同于该类的x00状态代码,但不得高速缓存无法识别的响应.例如,如果客户端收到无法识别的状态代码431,则可以安全地假设其请求有问题并将响应视为已收到400状态代码.在这种情况下,用户代理应该向用户呈现随响应返回的实体,因为该实体可能包括将解释异常状态的人类可读信息.
为什么get_FOO_display()在记录信息(django)时会返回整数值?
我有一个模型字段,它使用一个选项来限制其值.这工作正常,我在应用程序中的任何地方工作,除了记录信息时,get_FOO_display()方法返回基础整数值而不是人类可读的版本.
这是模型定义(删节):
THING_ROLE_MONSTER = 0
THING_ROLE_MUMMY = 1
ROLE_CHOICES = (
(THING_ROLE_MONSTER, u'Monster'),
(THING_ROLE_MUMMY, u'Mummy'),
)
# definition of property within model
class Thing(models.Model):
...
role = models.IntegerField(
'Role',
default=0,
choices=ROLE_CHOICES
)
Run Code Online (Sandbox Code Playgroud)
如果我在(django)交互式shell中运行它,它的行为与您期望的完全相同:
>>> from frankenstein.core.models import Thing
>>> thing = Thing()
>>> thing.role = 0
>>> thing.get_role_display()
u'Monster'
Run Code Online (Sandbox Code Playgroud)
但是,当我在字符串格式化/日志记录方案中使用完全相同的构造时,我遇到了问题:
logger.info('New thing: <b>%s</b>', thing.get_role_display())
Run Code Online (Sandbox Code Playgroud)
收益:
New thing: <b>0</b>
Run Code Online (Sandbox Code Playgroud)
救命!
[更新1]
当我在交互式shell中运行日志记录时,我得到了正确的输出:
>>> from frankenstein.core.models import Thing
>>> import logging
>>> thing = Thing()
>>> thing.role = 0
>>> …
Run Code Online (Sandbox Code Playgroud) OData被吹捧为REST风格数据服务的新开放标准,但是我找不到太多证据表明任何没有插入MSFT开发人员社区的人都会愤怒地使用它.如果它是一个开放的标准,我希望从Java/Ruby/Python/PHP社区获得更多的牵引力.
问题背后的背景是我正在寻找创建一些开放(公共)数据apis,虽然OData似乎是一条明显的下降路线,但感觉网络开发社区并不真正关心?
我想使用Fabric命令来设置本地开发环境,作为其中的一部分,我希望能够设置一个git远程.这很好用:
from fabric.api import local
def set_remote():
""" Set up git remote for pushing to dev."""
local('git remote add myremote git@myremote.com:myrepo.git')
Run Code Online (Sandbox Code Playgroud)
问题在于第二次运行 - 当本地命令因为远程已经存在而爆炸时.我想通过先检查遥控器是否存在来防止这种情况:
在伪代码中,我想做以下事情:
if 'myremote' in local('git remote'):
print 'Remote \'myremote\' already exists.'
else:
local('git remote add myremote git@myremote.com:myrepo.git')
Run Code Online (Sandbox Code Playgroud)
我怎样才能做到这一点?
我有一个在Heroku上愉快地运行的应用程序,但是它被注册为"开发"应用程序,我不能在我的生活中找到任何正式定义的"生产"应用程序,尽管应用程序仪表板和状态页面在两者之间做出非常明确的区分.
我已经看到了对这两者状态的这种解释,这表明差异是隐含的(基于使用)而不是显式(基于某些配置/设置):
生产问题是影响运行,稳定,生产应用程序的问题,这些应用程序至少有两个Web dynos并使用生产级数据库(或根本没有数据库).包括dynos,数据库,HTTP缓存,其他平台组件(DelayedJob worker,scheduler等)和路由.
开发问题是影响部署工作流和工具运行状况的问题.包括部署(git push,gem安装,slug编译等),一般git活动,命令行gem/API(扩展/缩小,更改配置等)以及相关服务(rake,console,db push/pull)与TAPS等).开发还包括特定于非生产应用程序操作的问题,例如unidling免费1-dyno应用程序和开发数据库的操作.
即使这些解释也引用了开发和生产数据库之间的神秘差异,尽管在任何地方都没有相应的解释.$ 9pcm'Basic'Postgres是否计划一个'生产'数据库?
[UPDATE]
现在,您的Heroku帐户中的应用仪表板上有一个"运行生产检查"链接,其中显示了确定应用状态的步骤.附上截图:
fabric ×2
asp.net-mvc ×1
bash ×1
django ×1
heroku ×1
http ×1
iis ×1
nginx ×1
odata ×1
postgresql ×1
python ×1
shell ×1
ubuntu ×1
vagrant ×1
virtualenv ×1