西西河

主题:【求助】apache中 .htaccess的 url_rewrite的使用 -- 铁手

共:💬9
全看树展主题 · 分页首页 上页
/ 1
下页 末页
家园 【求助】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";'

不知能否帮得上忙

家园 关于 .htaccess

如果能够更改http.conf,就不要用.htaccess

.htaccess是 per directory, overhead比较高

家园 回头我试验一下那个 redirect match. 估计那个比较对头
家园 R=301

RewriteRule ... [R=301,L] #发出一个外部重定向命令,L表示后面的语句就不管了,Last。

现在这个 http://cchere.net/thread/433325 到RA2.php?...这个转换是内部的,不一样的。

R=301
家园 忘了说一个满重要的

当在目录级用htaccess操作时。可能需要用RewriteCond定义重写发生的条件,否则可能陷入死循环。

原因是:

A 新URL->内部重定向到老URL

B 老URL->外部重定向到新URL

因为最后Apache都得去面对老URL,若不定义条件,它就可能去做B操作,那就是死循环了。

有一个环境变量好象是Requst_URI,记录的是最初客户端请求的URL,大约应该是用这个做判断来确定B操作发生的条件,以避免对内部已经重写的URL再应用B操作。

家园 感觉有些太复杂。

我后来想想,不如索性把原来的RA2换个名字,用REWRITE到那里,然后在RA2里面放一个301 REDIRECT。这样可能比较容易一些。

改那个HTACCESS。把西西河搞死过几次:)

家园 补充:的确出现过死循环。如 RA2.php 换成 RA3.php文件名

是不是可以避免死循环的问题?

也就是说,在 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]是没有用的。

全看树展主题 · 分页首页 上页
/ 1
下页 末页


有趣有益,互惠互利;开阔视野,博采众长。
虚拟的网络,真实的人。天南地北客,相逢皆朋友

Copyright © cchere 西西河