我有一个使用cakePHP在IIS 7下设置的php网站。它使用/index.php/[controller]/[action]/[etc]
形式的不那么漂亮的URL运行了很长一段时间。足够长的时间让人们有书签和谷歌索引一切。我现在修复了web.config
,以便使用的网址来自/[controller]/[action]/[etc]
,绕过网址中的index.php
(内部全部转到同一位置)。< / p>
问题是,如果您访问旧格式的其中一个链接,该页面仍然在技术上有效,但css / images / etc没有被加载,看起来很难看。是否有一种简单的方法可以将重定向从/index.php/*
格式转换为新的/*
格式?
以下是我现有的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="IsDirectory" negate="true" />
<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="IsDirectory" negate="true" />
<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>
答案 0 :(得分:1)
我找到了我所缺少的东西。在重定向规则中,我在/index.php/*
上匹配,但我没有意识到您可以使用$0
,$1
,$2
等将匹配的字符串添加到目标中。另外值得注意的是,exactDestination="true"
是必要的,否则会将/index.php/[controller]/[action]/[etc]
重定向到/[controller]/[action]/[etc]/index.php/[controller]/[action]/[etc]
我只需将以下部分添加到web.config
的顶部(<system.webserver>
部分,<rewrite>
部分之前:
<httpRedirect enabled="true" exactDestination="true" httpResponseStatus="Permanent">
<add wildcard="/index.php/*" destination="/$0" />
</httpRedirect>