关于apache 设置 301 跳转的问题,进来看看!!

归海一刀 发布于 2013/10/07 14:22
阅读 1K+
收藏 0

是这样的,以前网站的URL如下:

http://www.168btjob.com/jobs/jobs-show.php?id=1640

其伪静态后的地址如下:

http://www.168btjob.com/jobs/show-jobs-1640.html

伪静态规则:


RewriteRule ^jobs/show-jobs-([0-9]+)\.html$ jobs/jobs-show\.php\?id=$1 [L,NC]
这个规则可以实现以前的地址静态化,但现在有个问题,因为在没有被静态化之前网站已经被搜索引擎收录了许多类似  http://www.168btjob.com/jobs/jobs-show. php?id=1640 的URL地址,我现在想将这类地址做301跳转到http://www.168btjob.com/jobs/show-jobs-1640.html 这类静态页面。试了多次都不成功。以下是我的 .htaccess 配置文件,求高手指教。


Options +FollowSymLinks
<IfModule mod_rewrite.c>
RewriteEngine on

RewriteCond %{HTTP_HOST} ^168btjob.com [NC]
RewriteRule ^(.*)$ http://www.168btjob.com/$1 [L,R=301]

RewriteRule ^jobs/jobs-show\.php\?id=([0-9]+)$ jobs/show-jobs-$1\.html [L,R=301] #此处不起作用
RewriteRule ^jobs/show-jobs-([0-9]+)\.html$ jobs/jobs-show\.php\?id=$1 [L,NC]

RewriteRule ^company/show-company-([0-9]+)\.html$ company/company-show\.php\?id=$1
RewriteRule ^news/show-([0-9]+)\.html$ news/news-show\.php\?id=$1
RewriteRule ^notice/show-([0-9]+)\.html$ notice/notice-show\.php\?id=$1
RewriteRule ^resume/show-([0-9]+)\.html$ resume/resume-show\.php\?id=$1

</IfModule>




加载中
0
彷徨的看着你
彷徨的看着你
RewriteRule ^jobs/jobs-show\.php\?id=([0-9]+)$ http://www.168btjob.com/jobs/show-jobs-$1\.html [L,R=301]
0
归海一刀
归海一刀

引用来自“彷徨的看着你”的答案

RewriteRule ^jobs/jobs-show\.php\?id=([0-9]+)$ http://www.168btjob.com/jobs/show-jobs-$1\.html [L,R=301]
这个我试过了,还是不行的。
0
归海一刀
归海一刀

哎,看来没人会知道了。 

经过考虑,我最终选择了在程序里面通过获取 $_SERVER['REQUEST_URI'] 判断后,使用程序来处理 301跳转了。

0
Tuesday
Tuesday

明显是逻辑错误有问题.

RewriteRule ^jobs/jobs-show\.php\?id=([0-9]+)$ jobs/show-jobs-$1\.html [L,R=301]#此处不起作用

RewriteRule ^jobs/show-jobs-([0-9]+)\.html$ jobs/jobs-show\.php\?id=$1 [L,NC]

这两条被重复执行了, 第一条解析成了第二条所需要的条件.
最重要的一个观点就是, 伪静态决不会某条规则匹配后就执行, 跟php, java是一样的, 它都要解析完所有的规则才执行.

所以, 请在两行中间加一句判断:

RewriteCond %{REQUEST_FILENAME} !-f

让它跳过下一行解析. 不过有时你更要思考, 已经是伪静态的解析结果, 文件肯定不存在, 但你可以写个区别体.

 

0
Tuesday
Tuesday
RewriteRule ^jobs/jobs-show\.php\?id=([0-9]+)$ jobs/show-jobs-$1\.html?demo=1 [L,R=301] #先让这一句匹配可以跳过下一行.因为后面加了些字符, 肯定不会匹配下一行.

RewriteRule ^jobs/show-jobs-([0-9]+)\.html$ jobs/jobs-show\.php\?id=$1 [L,NC] 

#接着, 再让它恢复正常.... 重点是让上面这一行解析能够过滤地抛弃某条规则.
RewriteRule ^jobs/show-jobs-([0-9]+)\.html\?demo=1$ jobs/show-jobs-$1\.html [L,NC]
0
归海一刀
归海一刀

引用来自“Tuesday”的答案

RewriteRule ^jobs/jobs-show\.php\?id=([0-9]+)$ jobs/show-jobs-$1\.html?demo=1 [L,R=301] #先让这一句匹配可以跳过下一行.因为后面加了些字符, 肯定不会匹配下一行.

RewriteRule ^jobs/show-jobs-([0-9]+)\.html$ jobs/jobs-show\.php\?id=$1 [L,NC] 

#接着, 再让它恢复正常.... 重点是让上面这一行解析能够过滤地抛弃某条规则.
RewriteRule ^jobs/show-jobs-([0-9]+)\.html\?demo=1$ jobs/show-jobs-$1\.html [L,NC]
谢谢你,看了你写的感觉可行,我明天去公司试试。
返回顶部
顶部