具有友好URL的多个htaccess重写规则

时间:2012-03-31 23:03:45

标签: php apache .htaccess mod-rewrite permalinks

我的移动网站(受wordpress启发的小型自定义CMS)有一个主页,博客页面,新闻页面,关于页面和联系页面./blog ./news ./about和{ {1}}是实际文件夹。 主页博客新闻是分页的。 关于联系人是单页,没有分页。

我需要htaccess重写规则来执行以下(A)和(B)。我只用(A)取得了进展,而htaccess文件位于站点根目录中。

(A)

  • ./contact重写为m.website.com/index.php?page=1
  • m.website.com重写为m.website.com/index.php?page=2
  • m.website.com/page/2重写为m.website.com/blog/index.php?page=1
  • m.website.com/blog重写为m.website.com/blog/index.php?page=2
  • m.website.com/blog/page/2重写为m.website.com/news/index.php?page=1
  • m.website.com/news重写为m.website.com/news/index.php?page=2

问题: 以下是我正在使用的内容,但我现在只为主页工作了。我不知道如何将规则结合起来包括 blog news 页面。此外,它复制了我的链接,因为m.website.com/news/page/2m.website.com都在使用中。我需要在任何地方摆脱m.website.com/page/1。分页应该从第2页开始。我试图使用RedirectMatch摆脱它,但它没有用,所以我评论了它。

/page/1

(B)

  • 我已经有一个 permalink.php 文件,该文件接受漂亮的网址并返回其postID
  • 主页,博客或新闻页面上每篇文章的详细阅读链接格式为RewriteEngine On RewriteBase / RewriteRule ^page/(.*) index.php?page=$1 [NC] #RedirectMatch 301 ^/page/1/$ http://m.website.com/
  • 点击后,htaccess将使用字符串http://m.website.com/2012/03/the-post-title查询permalink.php以获取postID,然后打开/2012/03/the-post-title ,但地址栏中的地址将为{ {1}}这显示了完整的文章,无论是主页,博客页面还是新闻页面。

问题:我一直在寻找,我不确定如何去做(B),但我知道这是可能的。最后,A和B的所有规则都将位于站点根目录中的相同htaccess文件中。

由于

1 个答案:

答案 0 :(得分:2)

这应该可以帮到你。看起来你已经做了大部分工作,所以没有muc可做。

RewriteEngine On  
RewriteBase /

# you do not need a rewrite for the root as you should have index.php
# as your default document and page 1 as your default page

RewriteRule ^page/1/?$                    / [NC,L,R=301]
RewriteRule ^page/(\d+)/?$                index.php?page=$1 [NC,L]

# you do not need a rewrite for blog as you should have index.php as your
# default document and page 1 as your default page

# you do not need a rewrite for news as you should have index.php as your
# default document and page 1 as your default page

RewriteRule ^(blog|news)/page/1/?$        $1 [NC,L,R=301]
RewriteRule ^(blog|news)/page/(\d+)/?$    $1/index.php?page=$2 [NC,L]

######################################################################
################## ADD YOUR PERMALINK.PHP CODE HERE ##################
######################################################################

<强>更新 要有效地将/ 2012/03 /后标题转换为postID,您需要能够让您的数据库为您执行此操作,因为它是唯一知道答案的内容。所以你可以使用RewriteMap http://httpd.apache.org/docs/2.3/rewrite/rewritemap.html#dbd我自己从未这样做过,我会反对它。不是因为我知道它有问题我只是对它感觉不好。

替代方案和我支持的方法就是做这样的事情: -

RewriteRule ^(\d{4})/(\d{2})/([^/]+))/?$     article.php?postIdentifier=$1/$2/$3 [L]

然后在article.php中点击数据库并使用postIdentifier中的信息来获取正确的文章。

有意义吗?