Django项目部署IIS后遇CORS错误及500内部服务器错误求助
Django部署IIS后CORS跨域+500错误排查方案
一、跨域问题(Access-Control-Allow-Origin缺失)
即便已配置CORS_ALLOW_ALL_ORIGINS=True和CorsMiddleware,仍可能因IIS层干预失效,按以下步骤排查:
- 禁用IIS独立CORS模块:若IIS安装并单独配置了CORS模块,会覆盖Django输出的响应头。直接卸载该模块,或统一使用Django的CORS中间件处理跨域。
- 强制中间件顺序:
CorsMiddleware必须放在中间件列表最顶部,尤其是在CommonMiddleware之前,示例配置:MIDDLEWARE = [ 'corsheaders.middleware.CorsMiddleware', # 必须排在第一位 'django.middleware.common.CommonMiddleware', # 其他中间件... ] - 确保请求头完整传递:IIS的URL重写规则可能丢失
Origin请求头,需在web.config的重写规则中保留该头:<rule name="Django Rewrite" stopProcessing="true"> <match url="(.*)" /> <conditions logicalGrouping="MatchAll"> <add input="{REQUEST_FILENAME}" matchType="IsFile" negate="true" /> <add input="{REQUEST_FILENAME}" matchType="IsDirectory" negate="true" /> </conditions> <action type="Rewrite" url="wsgi.py/{R:1}" /> <serverVariables> <set name="HTTP_ORIGIN" value="{HTTP_ORIGIN}" /> # 保留Origin请求头 </serverVariables> </rule> - HTTPS环境补充配置:部署后使用HTTPS的话,添加以下settings配置:
CORS_ALLOW_CREDENTIALS = True SESSION_COOKIE_SECURE = True CSRF_COOKIE_SECURE = True
二、POST请求500内部服务器错误
其他API正常说明基础环境无问题,重点排查该接口的特殊性:
- 查看Django错误日志:生产环境默认不输出详细错误,需配置LOGGING写入文件定位问题:
LOGGING = { 'version': 1, 'disable_existing_loggers': False, 'handlers': { 'file': { 'level': 'ERROR', 'class': 'logging.FileHandler', 'filename': '/path/to/your/django/error.log', # 确保IIS应用池有权限写入 }, }, 'loggers': { 'django': { 'handlers': ['file'], 'level': 'ERROR', 'propagate': True, }, }, } - 检查应用池权限:该接口可能涉及文件写入、外部服务调用等操作,确认IIS应用池的身份(如LocalSystem或具备对应权限的域账户)能访问相关资源。
- 认证与会话校验:HTTPS环境下会话可能失效,检查请求是否携带正确的认证信息(session cookie或token),同时修正settings中的域名配置:
SESSION_COOKIE_DOMAIN = 'website.website.com' # 修正原地址中的重复域名点(website..com) CSRF_TRUSTED_ORIGINS = ['https://website.website.com'] - 接口参数验证:对比本地测试与生产环境的POST参数,检查是否存在编码错误、参数缺失或格式不兼容(如JSON字段名大小写不一致)。
三、额外注意点
原请求地址https://website.website..com:8000存在域名重复点(website..com),需先修正为正确域名,这可能同时导致CORS校验和会话验证失败。
内容的提问来源于stack exchange,提问作者Ekrem Şallı
相关产品推荐
相关产品推荐

