主题:【求助】apache中 .htaccess的 url_rewrite的使用 -- 铁手
目前西西河已经使用类似 http://www.cchere.com/article/433305
的方式,来方便搜索引擎,同时也是容易看。
目前的一个问题是,以前有很多贴在搜索引擎上有,如果能更新一下的话,很多工作不必从头开始。
现在想做的是,能够把以前诸如
/ article/433305
redirect 301 到
http://www.cchere.com/article/433305
怎么样弄 rewrite rule 才行?
本帖一共被 1 帖 引用 (帖内工具实现)
Under “Canonical URLs”
RewriteRule /cbbs/Ps/RA2.php\?AID=(\d+) /article/$1 [R]
似乎也可以用
RedirectMatch /cbbs/Ps/RA2.php\?AID=(\d+) /article/$1
没太看明白两者的区别,似乎是RedirectMatch用来Redirect,RewriteRule是内部工作,外界见到的URL不变。
俺的RE是用perl试的
perl -e '$a = "/article/433305;; $a =~ s@/cbbs/Ps/RA2.php\?AID=(\d+)@/article/$1@o; print "$a\n";'
不知能否帮得上忙
如果能够更改http.conf,就不要用.htaccess
.htaccess是 per directory, overhead比较高
RewriteRule ... [R=301,L] #发出一个外部重定向命令,L表示后面的语句就不管了,Last。
现在这个 http://cchere.net/thread/433325 到RA2.php?...这个转换是内部的,不一样的。
当在目录级用htaccess操作时。可能需要用RewriteCond定义重写发生的条件,否则可能陷入死循环。
原因是:
A 新URL->内部重定向到老URL
B 老URL->外部重定向到新URL
因为最后Apache都得去面对老URL,若不定义条件,它就可能去做B操作,那就是死循环了。
有一个环境变量好象是Requst_URI,记录的是最初客户端请求的URL,大约应该是用这个做判断来确定B操作发生的条件,以避免对内部已经重写的URL再应用B操作。
我后来想想,不如索性把原来的RA2换个名字,用REWRITE到那里,然后在RA2里面放一个301 REDIRECT。这样可能比较容易一些。
改那个HTACCESS。把西西河搞死过几次:)
是不是可以避免死循环的问题?
也就是说,在 rewrite rule里是
/RA2.php?AID=xxx 定向到 /article/xxx [R=301]
/article/xxx 定向到 RA3.php?AID=xxx [L]
这样,是不是可以解决问题?
不过那个[L]的使用可能您有一些误解。
[L]指的是本次htaccess执行的时候,执行了这句就不用管后面的语句了,退出本次htaccess执行。
但实际上htaccess是会被多次执行的。每次重新生成URL后,新URL被注入Apache核心,然后一级一级解释下去,到达这个目录的时候,htaccess又会被重新执行。
所以避免死循环的关键是重写后的URL在第2次被分析的时候,就不满足RewriteRule了。[L]是没有用的。