IIS重写和处理程序冲突

时间:2017-03-29 21:51:19

标签: django iis url-rewriting wfastcgi

我正在尝试在IIS下设置Django / Angular应用程序。

当我在nginx下设置类似的应用程序时,我将所有以/api(我的后端)或/admin(Django管理界面)开头的URL传递给Django。我还设置了两个位置://static - 两者都是包含所有静态资源的文件夹的别名。

我也需要别名/static,因为Django的管理应用程序引用/static/admin/...上的资源

我无法让IIS以相同的方式工作。我正在使用wfastcgi与Django进行交互,并使用重写规则将/static映射回/。这是我Web.config的相关部分:

<rewrite>
    <rules>
        <rule name="Static Perfix" stopProcessing="true" >
            <match url="^static/(.+)" />
            <action type="Rewrite" url="{R:1}" />
        </rule>
    </rules>
</rewrite>
<handlers>
    <add name="Admin" 
         path="/admin" 
         verb="*" 
         modules="FastCgiModule" 
         scriptProcessor="..." 
         resourceType="Unspecified" />
</handlers>

这不起作用。当我访问/admin时,处理程序捕获它并将请求转发给Django,就像它应该的那样。 Django返回一个html页面,其资源位于/static/admin/base.css(例如)。

当浏览器尝试加载这样的资源时,重写规则捕获它,将其重写为/admin/base.css,然后处理程序捕获它并将其转发给Django,后者不知道/admin/base.css是,并返回404。

我尝试将/static虚拟目录指向与根目录相同的物理目录。这导致了各种冲突,因为我的根Web.config被读了两次,导致了各种重复的密钥违规(对于我定义的所有密钥,或多或少)。

对于摆脱这种情况,我将不胜感激。

1 个答案:

答案 0 :(得分:0)

我最终通过重构静态资源文件夹并添加包含Admin静态文件的实际static子文件夹来完全避免这个问题。

我将无法再使用manage.py collectstatic进行前端部署,但我需要创建一个额外的脚本。哦,好吧。