Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
251 views
in Technique[技术] by (71.8m points)

php - Create blog post links similar to a folder structure

I am currently working on a blog where I would like to create links to my individual articles in the following form:

http://www.mysite.com/health/2013/08/25/some-random-title
                      ------            -----------------
                        |                       |
                     category                 title

However I have no idea how to achieve this.

I have found something that would give me the URI.

$uri = $_SERVER["REQUEST_URI"];

I would then go ahead and extract the needed parts and make requests against the database. This may seem a very very dumb question, but I do not know how to look this up on google (I tried...) but how exactly am I going to handle the link ?

I try to explain it step-by-step:

User clicks on article title -> the page reloads with new uri --> Where am I supposed to handle this new uri and how ? If the request path looked like this:

index.php?title=some-random-article-title

I would do it in the index.php and read the $_GET array and process it accordingly. But how do I do it with the proposed structure at the beginning of this question ?

See Question&Answers more detail:os

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Reply

0 votes
by (71.8m points)

You will need a few things:

  1. Setup an .htaccess to redirect all request to your main file which will handle all that, something like:

    <IfModule mod_rewrite.c>
    RewriteEngine On
    RewriteBase /
    RewriteRule ^index.php$ - [L]
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteRule . /index.php [L]
    </IfModule>
    

    The above will redirect all request of non-existent files and folder to your index.php

  2. Now you want to handle the URL Path so you can use the PHP variable $_SERVER['REQUEST_URI'] as you have mentioned.

  3. From there is pretty much parse the result of it to extract the information you want, you could use one of the functions parse_url or pathinfo or explode, to do so.

Using parse_url which is probably the most indicated way of doing this:

$s = empty($_SERVER["HTTPS"]) ? '' : ($_SERVER["HTTPS"] == "on") ? "https" : "http";
$url = $s . '://' . $_SERVER["HTTP_HOST"] . $_SERVER["REQUEST_URI"];
var_dump(parse_url($url));

Output:

["scheme"] => string(4) "http" 
["host"]   => string(10) "domain.com" 
["path"]   => string(36) "/health/2013/08/25/some-random-title" 
["query"]  => string(17) "with=query-string"

So parse_url can easily break down the current URL as you can see.

For example using pathinfo:

$path_parts = pathinfo($_SERVER['REQUEST_URI']);

$path_parts['dirname'] would return /health/2013/08/25/

$path_parts['basename'] would return some-random-title and if it had an extension it would return some-random-title.html

$path_parts['extension'] would return empty and if it had an extension it would return .html

$path_parts['filename'] would return some-random-title and if it had an extension it would return some-random-title.html

Using explode something like this:

$parts = explode('/', $path);
foreach ($parts as $part)
    echo $part, "
";

Output:

health
2013
08
25
some-random-title.php

Of course these are just examples of how you could read it.

You could also use .htaccess to make specific rules instead of handling everything from one file, for example:

RewriteRule ^([^/]+)/([0-9]+)/([0-9]+)/([0-9]+)/([^/]+)/?$ blog.php?category=$1&date=$2-$3-$4&title=$5 [L]

Basically the above would break down the URL path and internally redirect it to your file blog.php with the proper parameters, so using your URL sample it would redirect to:

http://www.mysite.com/blog.php?category=health&date=2013-08-25&title=some-random-title

However on the client browser the URL would remain the same:

http://www.mysite.com/health/2013/08/25/some-random-title

There are also other functions that might come handy into this for example parse_url, pathinfo like I have mentioned early, server variables, etc...


与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
OGeek|极客中国-欢迎来到极客的世界,一个免费开放的程序员编程交流平台!开放,进步,分享!让技术改变生活,让极客改变未来! Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

...