最近将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]