get提交的url静态化改写及.htaccess常见问题 | 二大人
Width Mode: Auto Font size: Small | Normal | Large

.htaccess常见问题

一、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就没有问号和与符号了,很清爽,可以用-或者/来连接变量。

url改写

get提交url改写

你可能还会喜欢


  1. 这个真是解决我大麻烦了,问号的转义问题。
    谢谢!

    [Reply]

    二大人 Reply:

    呵呵,我正好也是前不久发现了这个方法.
    ps:你的博客很漂亮.

    [Reply]

  1. 还没有引用