我们的 IIS 托管着我们自己的网站。但最近我们接到任务,在子目录中托管使用 Laravel 构建的第三方网站。
网站正在加载,但由于第三方网站请求资源的方式,大多数资源(如 CSS 和 JS 文件)均未加载 (404)。例如:
<script source="/js/site.js"></script>
/js/site.js
翻译为https://defaultwebsite/js/site.js
不存在。我需要/js/site.js
翻译为https://defaultwebsite/laravel/public/js/site.js
。
这在 IIS 10 中可以实现吗?
这是目录树的草图:
+ defaultwebsite
| + laravel
| | + public
| | | + js
| | | | - site.js
| | | - index.php
| + js
| | - ourownjs.js
| - index.php
我们设置了两个重写规则来处理重定向,如下https://defaultwebsite/lavarel
所示https://defaultwebsite/laravel/public
:
<system.webServer>
<rewrite>
<rules>
<rule name="Imported Rule 1-1" stopProcessing="true">
<match url="^" ignoreCase="false" />
<conditions logicalGrouping="MatchAll">
<add input="{HTTP_AUTHORIZATION}" ignoreCase="false" />
<add input="{REQUEST_FILENAME}" matchType="IsDirectory" ignoreCase="false" negate="true" />
<add input="{URL}" pattern="(.+)/$" ignoreCase="false" />
</conditions>
<action type="Redirect" url="{C:1}" redirectType="Permanent" />
</rule>
<rule name="Imported Rule 2-1" stopProcessing="true">
<match url="^" ignoreCase="false" />
<conditions logicalGrouping="MatchAll">
<add input="{REQUEST_FILENAME}" matchType="IsDirectory" ignoreCase="false" negate="true" />
<add input="{REQUEST_FILENAME}" matchType="IsFile" ignoreCase="false" negate="true" />
</conditions>
<action type="Rewrite" url="index.php" />
</rule>
</rules>
</rewrite>
</system.webServer>
更新 我最近将此规则添加到根目录(默认网站),但当 laravel 网站请求资源时,它似乎没有触发此规则。尽管我可以看到 HTTP_REFERER 模式是正确的。
<rewrite>
<rewriteMaps>
<rewriteMap name="Root" />
</rewriteMaps>
<rules>
<rule name="Rewrite Root => Laravel" stopProcessing="true">
<match url="(img|js|css)?(.*)" />
<conditions>
<add input="{HTTP_REFERER}" pattern="^https://www.defaultsite.be/laravel(.*)" />
</conditions>
<action type="Rewrite" url="laravel/public/{R:1}{R:2}" appendQueryString="true" logRewrittenUrl="true" />
</rule>
</rules>
</rewrite>
答案1
好吧,我自己也不完全理解它。IIS 永远不会成为我的朋友 :)
当我将规则更改为重定向而不是重写时,它开始工作:
<rules>
<rule name="Rewrite Root => Laravel" stopProcessing="true">
<match url="(img|js|css)?(.*)" />
<conditions>
<add input="{HTTP_REFERER}" pattern="laravel/.*" />
<!-- <add input="laravel\public\{R:1}{R:2}" matchType="IsFile" /> -->
</conditions>
<action type="Redirect" url="/laravel/{R:0}" appendQueryString="true" logRewrittenUrl="false" redirectType="Permanent" />
</rule>
</rules>