如何在 IIS 上正确配置 web.config 以发布 YII2 Advanced

How to propper configure web.config on IIS to publish YII2 Advanced

我正在安装基于 YII2 高级主题的应用程序。它在 Apache 上运行良好,但在 IIS 7 上安装时,漂亮的 url 会非常糟糕,我使用以下 web.config

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <configSections>
        <sectionGroup name="system.webServer">
            <sectionGroup name="rewrite">
                <section name="rewriteMaps" overrideModeDefault="Allow" />
                <section name="rules" overrideModeDefault="Allow" />
            </sectionGroup>
        </sectionGroup>
    </configSections>

    <system.webServer>
        <rewrite>
            <rules>
                <rule name="Imported Rule 1" stopProcessing="true">
                    <match url="^(.*)$" ignoreCase="false" />
                    <conditions>
                        <add input="{REQUEST_FILENAME}" matchType="IsFile" ignoreCase="false" negate="true" />
                        <add input="{REQUEST_FILENAME}" matchType="IsDirectory" ignoreCase="false" negate="true" />
                    </conditions>
                    <action type="Rewrite" url="index.php" />
                </rule>
            </rules>
        </rewrite>
    </system.webServer>
</configuration>

但是这个不行,因为当打开一个特定的路由时,它会尝试去那个路由,而不是在 YII2 中构建正确的路由。

这个问题可以在抛出的错误中看到,可以看到它试图打开物理路径\web\user\login,那显然不存在。相反,它应该打开类似 .../index.php?r=controller/action

的内容

在 apache 上我会使用:

RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)/$ / [L,R=301]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . index.php

任何可以帮助我解决这个问题的想法。

经过几天的搜索并试图理解为什么 dos 不起作用。运气不太好。

终于找到了

第一个:
确保你已经在 IIS7 上安装了 URL Rewrite。

如果你有 web.config 配置,它仍然路由到物理目录而不是 controller/action 路由,它 almost 100% 意味着你是缺少 URL Rewrite。是的,这是一个不一定安装的插件。

所以继续吧,从 URL Rewrite

下载并安装到您的 ISS

第二个:
这是实际工作的 web.config。请注意,我以:match url=".*" 结尾,还请注意我添加了一行来处理图像和其他静态内容。

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <configSections>
        <sectionGroup name="system.webServer">
            <sectionGroup name="rewrite">
                <section name="rewriteMaps" overrideModeDefault="Allow" />
                <section name="rules" overrideModeDefault="Allow" />
            </sectionGroup>
        </sectionGroup>
    </configSections>
    <system.webServer>
        <rewrite>
            <rules>
                <rule name="Yii2 Routing that works" stopProcessing="true">
                    <match url=".*" />
                    <conditions  logicalGrouping="MatchAll" trackAllCaptures="false">
                        <add input="{REQUEST_FILENAME}" pattern="css|js|jpg|jpeg|png|gif|ico|htm|html" negate="true" />                            
                        <add input="{REQUEST_FILENAME}" matchType="IsFile" ignoreCase="false" negate="true" />
                        <add input="{REQUEST_FILENAME}" matchType="IsDirectory" ignoreCase="false" negate="true" />
                    </conditions>
                    <action type="Rewrite" url="index.php" />
                </rule>
            </rules>
        </rewrite>
    </system.webServer>
</configuration>

最后 如果您使用的是 YII2 高级主题,请务必在两个 Web 目录中更新和配置您的 web.config。

这个菜单,你需要戴上它们:
C:\webroot****\www\backend\web\web.config
C:\webroot****\www\frontend\web\web.config

并确保更新您的 main.php «或 config.php 基本» 在高级上,您需要确保为前端和后端配置了 enablePrtettyUrl:

C:\webroot****\www\backend\config\main.php
C:\webroot****\www\frontend\config\main.php

'urlManager' => [
   'enablePrettyUrl' => true,
   'showScriptName' => false,
...
]

我还在调试和尝试解决一些小问题,os如果我发现其他问题,我会更新。