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

My mobile site (tiny custom CMS inspired by wordpress) has a homepage, blog page, a news page, an about page and a contact page where ./blog ./news ./about and ./contact are actual folders. Homepage, Blog and News are paginated. About and Contact are single pages, no pagination.

I need htaccess rewrite rules to do the following (A) and (B). I have only made progress with (A), and the htaccess file is in the site root.

(A)

  • m.website.com/index.php?page=1 re-writes to m.website.com
  • m.website.com/index.php?page=2 re-writes to m.website.com/page/2 etc
  • m.website.com/blog/index.php?page=1 rewrites to m.website.com/blog
  • m.website.com/blog/index.php?page=2 re-writes to m.website.com/blog/page/2 etc
  • m.website.com/news/index.php?page=1 rewrites to m.website.com/news
  • m.website.com/news/index.php?page=2 re-writes to m.website.com/news/page/2 etc

Problems: Below is what I'm using for the above, but I only got it working for the homepage for now. I don't know how to combine the rules to include blog and news pages too. Also, it duplicates my links because m.website.com and m.website.com/page/1 are both in use. I need to get rid of /page/1 everywhere. Pagination should start only from page 2. I tried to get rid of it using the RedirectMatch but it didn't work so I commented it out.

RewriteEngine On  
RewriteBase /
RewriteRule ^page/(.*) index.php?page=$1 [NC]
#RedirectMatch 301 ^/page/1/$ http://m.website.com/

(B)

  • I already have a permalink.php file which accepts pretty URLs and returns their postIDs
  • The read-more link for each article on the home, blog or news page will have the format http://m.website.com/2012/03/the-post-title
  • When clicked, the htaccess will query permalink.php with the string /2012/03/the-post-title to get the postID, then opens http://m.website.com/article.php?id=postID but the address in the address bar will be http://m.website.com/2012/03/the-post-title and this shows the article in full, be it home page, blog page or news page.

Problem: I have been searching and I'm not exactly sure how to go about (B) above but I know it's possible. In the end, all rules for A and B will be in the same htaccess file in the site root.

Thanks

This should do the trick for you. It looks like you have done most of it so there isn't muc to do.

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 ##################
######################################################################

UPDATE To effectively turn /2012/03/the-post-title into a postID you need to be able to ask your database to do that for you as it is the only thing that knows the answer. So you can either use a RewriteMap http://httpd.apache.org/docs/2.3/rewrite/rewritemap.html#dbd I have never done this myself and I would advise against it. Not because I know there is a problem with it I just have a bad feeling about it.

The alternative and one I would champion is to just do something like this:-

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

Then in article.php hit the database and use the information in the postIdentifier to get the correct article.

Make sense?