迁移Apache Zend应用至IIS后,href="#"按钮跳转异常求助
问题分析与解决方案
环境
PHP 5.5、Zend Framework v2.5、IIS v10
问题
将Apache网站迁移至IIS后,配置了URL重写规则,网站整体运行正常,但点击带有<a href="#">的模态框按钮时,按钮未按预期关闭模态框,反而跳转到网站首页。现有重写规则如下:
<rule name="Imported Rule 1" enabled="true" stopProcessing="true"> <match url="^.*$" /> <conditions logicalGrouping="MatchAny"> <add input="{REQUEST_FILENAME}" matchType="IsFile" pattern="" ignoreCase="false" /> <add input="{REQUEST_FILENAME}" matchType="IsDirectory" pattern="" ignoreCase="false" /> </conditions> <action type="None" /> </rule> <rule name="Imported Rule 2" enabled="true" stopProcessing="true"> <match url="^.*$" /> <action type="Rewrite" url="/index.php" /> </rule>
原因说明
<a href="#">中的#是客户端锚点,正常情况下浏览器不会向服务器发送新请求,仅触发页面滚动或客户端事件。出现跳转首页的情况,核心原因是模态框的JS代码未阻止<a>标签的默认跳转行为——点击按钮时,浏览器执行了默认的锚点跳转行为,而当前页面的路由路径(如/article/123)并非物理文件/目录,被IIS重写规则导向了index.php(首页)。
你的重写规则逻辑是正确的:先判断请求的是存在的文件或目录,是则直接返回;否则重写到index.php,和Apache的.htaccess规则逻辑一致,并非规则本身的问题。
解决方案
方法1:修正客户端代码(推荐)
修改模态框按钮的<a>标签,阻止其默认跳转行为:
- 直接在标签内添加阻止逻辑:
<a href="#" onclick="event.preventDefault(); /* 此处写入关闭模态框的代码 */">关闭模态框</a>
- 若使用jQuery,通过事件绑定处理:
$('a.modal-close-btn').click(function(e) { e.preventDefault(); // 阻止默认跳转 // 执行关闭模态框的代码,例如: $('#modal-container').hide(); });
- 或者替换
href为无跳转值:
<a href="javascript:void(0)" onclick="/* 关闭模态框代码 */">关闭模态框</a>
方法2:补充重写规则(仅覆盖根路径场景)
如果需要通过服务器规则辅助规避,可添加一条规则处理根路径请求,避免不必要的重写,但仅能解决根路径下的问题:
<rule name="Handle Root Path" enabled="true" stopProcessing="true"> <match url="^$" /> <action type="None" /> </rule>
将这条规则放在现有两条规则的最前面。
内容的提问来源于stack exchange,提问作者Paul H
相关产品推荐
相关产品推荐

