Create blog post links similar to a folder structure

前端 未结 2 1504
再見小時候
再見小時候 2020-11-28 16:33

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         


        
相关标签:
2条回答
  • 2020-11-28 16:48

    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, "\n";
    

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

    0 讨论(0)
  • 2020-11-28 17:00

    This is called Semantic URLs, they're also referred to as slugified URLs.

    You can do this with the .htaccess command RewriteURL

    Ex:

    RewriteURL ^(.*)$   handler.php?path=$1
    

    Now handler.php gets /health/2013/08/25/some-random-title and this is your entry point.

    0 讨论(0)
提交回复
热议问题