无独有偶,一位在用IIS8.5跑wordpress网站的朋友找到我,说处理数据迁移的过程中从win2003的环境迁移到了win2012后,出现“部分链接”报404的问题;
IIS8.5 很牛逼的赶脚;不过跑wordpress 再牛逼的IIS 也干不过linux下的nmp;
今天要说的问题依然奇葩:
IIS8.5下配置了伪静态后,正常的文章分类、文章标签、文章内容页面都能正常打开,而网站有一个产品的大分类是链接形式是:/portfolio-category/xxxxxxx
直接报404,然而这个分类下的产品内容页又能正常打开,链接格式如:/product/xxxxxx
仔细查看他的伪静态规则后,发现是伪静态内category关键词冲突导致的报404
原来的伪静态规则如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 |
<?xml version="1.0" encoding="UTF-8"?> <configuration> <system.webServer> <rewrite> <rules> <rule name="category"> <match url="category/?(.*)" /> <conditions logicalGrouping="MatchAll" trackAllCaptures="false" /> <action type="Rewrite" url="/index.php?category_name={R:1}" appendQueryString="false" logRewrittenUrl="false" /> </rule> <rule name="tags"> <match url="tag/?(.*)" /> <conditions logicalGrouping="MatchAll" trackAllCaptures="false" /> <action type="Rewrite" url="index.php?tag={R:1}" /> </rule> <rule name="Main Rule" stopProcessing="true"> <match url=".*" /> <conditions logicalGrouping="MatchAll" trackAllCaptures="false"> <add input="{REQUEST_FILENAME}" matchType="IsFile" negate="true" /> <add input="{REQUEST_FILENAME}" matchType="IsDirectory" negate="true" /> </conditions> <action type="Rewrite" url="index.php/{R:0}" /> </rule> <rule name="wordpress" patternSyntax="Wildcard"> <match url="*" /> <conditions logicalGrouping="MatchAll" trackAllCaptures="false"> <add input="{REQUEST_FILENAME}" matchType="IsFile" negate="true" /> <add input="{REQUEST_FILENAME}" matchType="IsDirectory" negate="true" /> </conditions> <action type="Rewrite" url="index.php" /> </rule></rules> </rewrite> </system.webServer> </configuration> |
从这里我们可以看到,这个规则对分类和标签进行了单独处理;刚好我们报404的链接的里带有category的关键词,就用了处理分类的重写规则来处理,这样就直接导致了404错误;
我们修改过的伪静态URL重写规则如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
<?xml version="1.0" encoding="UTF-8"?> <configuration> <system.webServer> <rewrite> <rules> <rule name="Main Rule" stopProcessing="true"> <match url=".*" /> <conditions logicalGrouping="MatchAll" trackAllCaptures="false"> <add input="{REQUEST_FILENAME}" matchType="IsFile" negate="true" /> <add input="{REQUEST_FILENAME}" matchType="IsDirectory" negate="true" /> </conditions> <action type="Rewrite" url="index.php/{R:0}" /> </rule> <rule name="wordpress" patternSyntax="Wildcard"> <match url="*" /> <conditions logicalGrouping="MatchAll" trackAllCaptures="false"> <add input="{REQUEST_FILENAME}" matchType="IsFile" negate="true" /> <add input="{REQUEST_FILENAME}" matchType="IsDirectory" negate="true" /> </conditions> <action type="Rewrite" url="index.php" /> </rule></rules> </rewrite> </system.webServer> </configuration> |
其实我们的处理思路很简单,就是说不对TAG和分类做单独处理,像apache或者nginx一样,把所有的非文件、非目录直接交由wordpress根目录的index.php来处理。
PS
:以上规则可能会出现中文URL 报错的情况;IIS升级到8.5后不知道是否支持中文URL ,这个没有时间亲测;有试过的小伙伴,请告知我一下。
您好,我在设置伪静态以后,网站的文章标签、文章目录、链接目录都打不开了怎么处理,点击后显示404
检查伪静态组件是否安装正确