1

我一直在尝试使用根文件夹中的以下 web.config 设置来获取重写规则以在 CakePHP 的 IIS 上工作:

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <system.webServer>
        <rewrite>
          <rules>
            <rule name="Imported Rule 1" stopProcessing="true">
              <match url="^$" ignoreCase="false" />
              <action type="Rewrite" url="app/webroot/" />
            </rule>
            <rule name="Imported Rule 2" stopProcessing="true">
              <match url="(.*)" ignoreCase="false" />
              <action type="Rewrite" url="app/webroot/{R:1}" />
            </rule>
            <rule name="Imported Rule 3" stopProcessing="true">
              <match url="^$" ignoreCase="false" />
              <action type="Rewrite" url="webroot/" />
            </rule>
            <rule name="Imported Rule 4" stopProcessing="true">
              <match url="(.*)" ignoreCase="false" />
              <action type="Rewrite" url="webroot/{R:1}" />
            </rule>
            <rule name="Imported Rule 5" stopProcessing="true">
              <match url="^(.*)$" ignoreCase="false" />
              <conditions>
                <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" appendQueryString="true" />
            </rule>
          </rules>
        </rewrite>
    </system.webServer>
</configuration>

所有的 CSS、JS 和其他文件都可以正常工作。与在主页中加载一样,但其他页面如/pages/about仅显示 404!

编辑: IIS 中设置的屏幕截图:

在此处输入图像描述

有什么问题?谢谢

4

2 回答 2

6

IIS7 本身不支持 .htaccess 文件。虽然有可以添加此支持的附加组件,但您也可以将 htaccess 规则导入 IIS 以使用 CakePHP 的本机重写。为此,请按照下列步骤操作:

1.使用微软的Web Platform Installer安装URL Rewrite Module 2.0或直接下载(32位/64位)。

2. 在 CakePHP 根文件夹中创建一个名为 web.config 的新文件。

3.使用记事本或任何 XML 安全编辑器并将以下代码复制到新的 web.config 文件中...

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <system.webServer>
        <rewrite>
            <rules>
            <rule name="Redirect static resources" stopProcessing="true">
            <match url="^(ico|img|css|files|js)(.*)$" />
            <action type="Rewrite" url="app/webroot/{R:1}{R:2}" appendQueryString="false" />
            </rule>
            <rule name="Imported Rule 1" stopProcessing="true">
            <match url="^(.*)$" ignoreCase="false" />
            <conditions logicalGrouping="MatchAll">

                        <add input="{REQUEST_FILENAME}" matchType="IsFile" negate="true" />
            </conditions>
            <action type="Rewrite" url="index.php?url={R:1}" appendQueryString="true" />
            </rule>
            <rule name="Imported Rule 2" stopProcessing="true">
              <match url="^$" ignoreCase="false" />
              <action type="Rewrite" url="/" />
            </rule>
            <rule name="Imported Rule 3" stopProcessing="true">
              <match url="(.*)" ignoreCase="false" />
              <action type="Rewrite" url="/{R:1}" />
            </rule>
            <rule name="Imported Rule 4" stopProcessing="true">
              <match url="^(.*)$" ignoreCase="false" />
              <conditions logicalGrouping="MatchAll">

                        <add input="{REQUEST_FILENAME}" matchType="IsFile" negate="true" />
              </conditions>
              <action type="Rewrite" url="index.php?url={R:1}" appendQueryString="true" />
            </rule>
            </rules>
        </rewrite>
    </system.webServer>
</configuration>
于 2013-09-22T12:52:13.783 回答
3

我对 IIS 没有太多经验,但是回到这个问题,我注意到一些明显的问题。IIS 已经导入了所有三个 CakePHP 的 .htaccess,而不考虑它们包含在哪个目录中。

CakePHP 附带了两个额外的 .htaccess 文件,因此用户可以轻松地将安装程序放入 Apache 中,并且无论他们尝试使用什么 URL,他们都应该总是(希望)被重定向到正确的.htaccess 文件,并且事情应该“正常工作”(TM ):

Document root     Additional .htaccess file     Correct .htaccess file
/ --------------> /.htaccess -----------------> /app/webroot/.htaccess
/app/ ----------> /app/.htaccess -------------> /app/webroot/.htaccess
/app/webroot ---------------------------------> /app/webroot/.htaccess

IIS 导入这些文件的方式,假设您的文档根设置为/,则不需要规则 3-4(来自第二个 .htaccess 文件)。但更重要的是,由于(.*)规则 2 中的包罗万象的正则表达式(来自第一个 .htaccess 文件),规则 2 之外的任何规则都不会执行——这意味着请求永远不会被传递给 index.php。

无论如何,您没有使用 Apache,因此您不能随意扔掉 CakePHP 安装,期望它们正常工作。在任何 Web 服务器(Apache、IIS、Nginx 等)上的生产环境(用于性能和安全性)中使用的正确文档根目录是恰当命名的/app/webroot目录。该目录包含 index.php、静态文件和正确的 .htaccess 文件。

之后,您只需要规则 5(来自正确的 .htaccess 文件)。它基本上是这样写的:“匹配所有请求并将它们发送到 index.php,除非有我们可以服务的真实文件或目录”:

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <system.webServer>
        <rewrite>
          <rules>
            <rule name="CakePHP" stopProcessing="true">
              <match url="^(.*)$" ignoreCase="false" />
              <conditions>
                <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" appendQueryString="true" />
            </rule>
          </rules>
        </rewrite>
    </system.webServer>
</configuration>
于 2012-10-03T19:32:08.250 回答