.htaccess常见问题
- 一月 5th, 2010
一、RewriteRule 后向引用的时候只能使用1-9 九个数字,0是整个截取的URL,如果超出了十个就没有办法继续引用了。
解决办法:此时可以借用RewriteCond 来帮助存入缓存几个,因为它引用的办法是% 。
例如:把u-1-2-3-4-5-6-7-8-9-10-11 跳转到 ?m=1&uid=2&username=3&subject=4&dateline1=5&dateline2=6&orderby=7&ordersc=8&perpage=9&page=10&end=11 这样一个冗余的网址。通过借用RewriteCond 缓存了三个变量。
RewriteCond %{REQUEST_URI} /u-([^-]*?)-([^-]*?)-([^-]*?)-
RewriteRule ^u-[^-]*?-[^-]*?-[^-]*?-([^-]*?)-([^-]*?)-([^-]*?)-([^-]*?)-([^-]*?)-([^-]*?)-(.*) ?m=%1&uid=%2&username=%3&subject=$1&dateline1=$2&dateline2=$3&orderby=$4&ordersc=$5&perpage=$6&page=$7&end=$8 [L]
二、待转向的URL存在?,正则中无法替代(chrom在空的form提交的时候url后面居然自动补一个问号)
举个简单的例子: 将u-1-2-?page=2 转到 ?m=1&username=2&page=2
简单的一个小例子,可是不知道?没有办法转义的话,会急死人。
我们可能会这样写:RewriteRule ^u-([^-]*?)-([^-]*?)-\?(.*)$ ?m=$1&username=$2$3 .但是因为问号没有办法转义,所以问号这一关是难以通过。
经过大量的测试,初步采取如下办法:
通过利用RewriteCond 的 %{QUERY_STRING}把page对应的参数截取下来。
所以能通过的方法是:
RewriteCond %{QUERY_STRING} ^page=(.+)$
RewriteRule ^u-([^-]*?)-(\w+)-$ ?m=$1&username=$2&page=%3
若干月后发现了一个小秘密,
解决的办法是用QSA‘(追加查询字符串)
手册上是这么写的:
‘qsappend|QSA‘(追 加查询字符串)
此标记强制重写引擎在已有的替换字符串中追加一个查询字符串,而不是简单的替换。如果需要通过重写规则在请求串中增加信息,就可以使用这个标记。
意思是强制追加参数!看来手册仍要好好看!
故非常简单即:RewriteRule ^u-([^-]*?)-([^-]*?)- ?m=$1&username=$2 [L ,QSA]
三、url请求匹配的顺序
是按照先后顺序一个个匹配,不满足往下走,满足了执行RewriteRule 然后碰到[L]离开去寻找指定的文件。
四、get提交数据进行URL改写
简单的一个小例子
<form name=”nbphp” id=”tosearch” mothed=”get” onsubmit=”return to_search();”>
<input type=”text” name=”m” id=”m” />
<input type=”submmit” value=”search”>
</form>
<script language=”javascript”>
function to_search(){
var m=$(‘#m’).val();
document.nbphp.action=’u-’m;
$(‘#to_search’).html(”);
}
</script>
用的jquery简单举个例子,其实原理很简单,数据提交之前用js先或许要提交的input的值,把这些值编成自己喜欢的url,然后作为form的action。最后把form里面所有的东西都清空,这样url就没有问号和与符号了,很清爽,可以用-或者/来连接变量。

get提交url改写






