2202月

搞定了两个无聊的Apache URL Rewrite

▧ 2008.02.22

http://blog.yimeng.ch/read.php?490

http://blog.yimeng.ch/read.php/238.htm

Rewrite:

http://blog.yimeng.ch/?p=490

http://blog.yimeng.ch/?p=238

RewriteEngine On RewriteBase /blog/ RewriteCond %{query_string} [0-9]+ RewriteRule ^read\.php$ /blog/?p=%{query_string} [R=301,L] RewriteRule ^read\.php/([0-9]+)\.htm$ /blog/?p=$1 [R=301,L]

1.第一个由于?后面的490不会在REQUEST_URI显示出来,因此只能用QUERY_STRING

2.第二个需要用到RewriteRule反向引用$1 (0 <= N <= 9)引用当前(带有若干RewriteRule指令的)RewriteCond中的与pattern匹配的分组成分(圆括号!)

PS:这里俺也不知道为什么要用1,个人感觉,应该是0啊,最后一条的RewriteRule里 是([0-9]+)第一个出现,可能是我正则理解有误?

3.感谢Rainux’s Weblog   Apache HTTP Server Version 2.2 文档mod_rewrite 模块

引用一下http://www.rainux.org/tag/apache/里的文章吧,因为这个例子让我茅塞顿开^_^

需求:

将 host/item.html?type=test rewrite 成 host/?q=item&type=test 其中 item 和 test 是可变的,并且 ?type=test 可有可无。

解决:

RewriteEngine On RewriteBase / RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_URI} ^/[^/]+.html$ RewriteCond %{QUERY_STRING} ^(type=.*)?$ RewriteRule ^([^/]+).html$ /?q=$1&%1 [L]

解释:

?type=test 是不会出现在 REQUEST_URI 里的,必须使用 QUERY_STRING 来获得它。 若有多个 RewriteCond,只能反向引用最后一个 RewriteCond 里的 pattern 的 group。 RewriteRule 后面的 pattern 是用来匹配当前 URL 的,当前 URL 不是 REQUEST_URI。因为(因此?)它会比 REQUEST_URI 少一个前导斜杠 “/",并且它可能已经被前面的 RewriteRule 改变过。 规则 BT 吧?第一个搞得我差点以为无解,第三个规则也消耗了我大量时间。本以为不用测试就能搞定的一个小问题居然花了 40 分钟左右才完成。-_-b

关联记录 · 1 条评论

杯子
大家好,雁过留声。顶!分享是可贵的,祝福是必须的,顶一下是必要的,