伪静态之后的URL还带问号【?】报404的解决方法

/ 0评 / 2

最近将ASP的博客改为PHP的博客。

朋友用我的域名做验证,是php文件,而我原来是ASP的,所以不冲突。但换了PHP之后,他的文件跟我的文件就冲突了,需要伪静态来跳转一下。这就遇到了一个小问题。

我想把  index.php?code=123 重写为  aaa.php?code=123

访问URL是带问号的,其实我就想把index.php通过URLRewrite转换为aaa.php 但URL中带问号,本来以为使用\转义一下就可以,但一直报404错误。

百度找了半天没找到,说是.net什么的问题,其实不对。后来发现一个有关问号的解决方法,第一次没解决成功,又找了一个差不多的解决方法,终于解决了。在这里分享一下。

核心内容是添加访问URL字符串判定,当URL中出现某字符串时此条规则生效,可以避开问号

先把规则发上来看下:

apache的

RewriteEngine On
RewriteBase /

RewriteCond %{QUERY_STRING} ^code=(.*)$
RewriteRule ^index\.php$ aaa\.php\?code=%1 [L]

IIS的

<rule name="已导入的规则 5" stopProcessing="true">
<match url="^index\.php$" ignoreCase="false" />
<conditions logicalGrouping="MatchAll">
<add input="{QUERY_STRING}" pattern="^code=(.*)$" ignoreCase="false" />
</conditions>
<action type="Rewrite" url="aaa.php\?code={C:1}" appendQueryString="false" />
</rule>

IIS的正常变量一般都是{R:1}但此次变量是在判断语句中,所以是{C:1}需要注意。

之前说过,条件判断语句只对下一条生效,IIS里的rewrite直接就写在rule里,更直观。

本条规则,只对URL中带code字符串的生效。

仔细又看了一下有关QUERY_STRING的介绍,原来这是服务器变量,用于获取查询字符串。

就是问号后面的内容。

RewriteCond %{QUERY_STRING} ^code=(.*)$  //用于判断问号后面是否有code=这个字符并将=后面的内容赋予为变量

RewriteRule ^index\.php$ aaa\.php\?code=%1 [L]  //是将原问号前的文件写上(猜的),并写上转换后的URL,写上变量。

也找到了一些英文介绍,但英语水平有限,看不懂。好在有一些大神解决了问题。在此也分享一下。

感谢这些大神们:http://www.geekso.com/rewrite/  

l另外在网上找到一个规则,不知道能不能用,没测试。有需要的可以试下

RewriteRule ^(.*)/search\.html(?:(\?.*))* $1/search\.php?$2 [L]

发表评论

电子邮件地址不会被公开。 必填项已用*标注