【问题标题】:Rewrite rules not working for CakePHP on IIS重写规则不适用于 IIS 上的 CakePHP
【发布时间】:2012-10-03 17:31:43
【问题描述】:

我一直在尝试使用根文件夹中的以下 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 中设置的屏幕截图:

有什么问题?谢谢

【问题讨论】:

  • IIS 404 还是 CakePHP 404?如果是后者,则在 core.php 中将 debug 设置为 2。
  • IIS 404 在蓝屏中显示为红色文本。
  • 如果将 IIS webroot 设置为 app/webroot 目录,则可以放弃规则 1-4 并缩小问题范围。
  • 据我所知,如果 REQUEST_FILENAME 行正常工作,您可能需要最后一行中 index.php 的完整相对路径(即 app/webroot/index.php) - 除非您听从我上面的建议。

标签: php cakephp iis


【解决方案1】:

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>

【讨论】:

  • 您好,我想在 iis7 服务器上部署 cakephp 应用程序。我设置了默认控制器和操作。没关系,但之后所有其他页面仅显示默认控制器和操作的显示页面。甚至我的默认管理页面也显示路由(/)页面。我的网址是one-stoppoolpros.com/onestoppool,你能帮帮我吗?重写模块已安装。我将 web.config 表单 cakephp 教程复制到文档 root.PLZ
  • 您的 URL 显示 404 文件目录未找到。您是否按照上述步骤进行操作? cakephp 使用 .htaccess 进行 URL 重写,但指定的 IIS 不支持,而是需要在应用程序的根目录中创建 web.config。如果您需要任何进一步的帮助,请告诉我。
  • 感谢@Tarun,这是因为我从服务器中删除了一些文件。我会更新并再次询问您。
【解决方案2】:

我对 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 之外的规则将永远执行 - 这意味着请求永远不会被传递到索引.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>

【讨论】:

  • 这修复了页面的路由问题,但现在所有 CSS 都不起作用。有任何想法吗?谢谢
  • 由于上述规则将所有请求(不是真实文件)传递给index.php,我猜你现在得到的是CakePHP 404?如果是这样,您想检查 CSS 文件的 URL,因为 IIS 在 webroot 文件夹中找不到它。
  • 是的,现在得到一个蛋糕 404。它说它找不到错误的 CssController。文件的 url 是正确的,例如/css/default.css。不确定修复是什么?我在 IIS 设置的 OP 中发布了一个屏幕截图。可能有什么问题吗?
  • 从截图看来,你的 webroot 是整个 / 文件夹,而不是 /app/webroot,但我可能不正确。我在这里的知识范围内没有我可以测试的 IIS 框,所以我做了更多的搜索。我认为this question 可能会引导您找到答案,特别是他链接到的“Imported Rule 0”。
  • 感谢您解决了问题 :) 您应该使用该链接中使用的代码更新您的答案,以便我接受您的答案对可能出现的其他人有意义。
猜你喜欢
  • 2019-03-13
  • 1970-01-01
  • 2018-09-10
  • 1970-01-01
  • 2018-01-22
  • 2013-03-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多