dongnanman9093 2017-07-29 13:18
浏览 51
已采纳

如何为单个页面创建多个URL别名?

I'm using PHP and I've read about how to create aliases and do a rewrite rule in Apache.

The thing is that I would rather like a functionality similar to the one that I do have in a Drupal site.

For example:

The URL example.com/info.php?id=18&type=article should be accessible as:

case 1: example.com/article/18

and

case 2: example.com/special-url-to-the-article

I do understand the basics on how to create a specific alias for each article (case 2):

I think that I should check the url with something like $_GET['id'] and $_GET['type'] to look into it in a database that holds the alias and the other values, and if the alias exist form a new url with the id and type and send the user there.

But how do I manage case 1, where I set the type of content and the content id programmatically?

I just need some guidance that could point me out to some direction.

  • 写回答

2条回答 默认 最新

  • douniao7308 2017-07-29 14:06
    关注

    I use a similar rewrite and, right or wrong, this is basically what I do. In both cases, your $_SERVER array should have one or more of these values:

    [REQUEST_URI] => /article/18/
    [QUERY_STRING] => article/18/
    [REDIRECT_URL] => /article/18/
    [REDIRECT_QUERY_STRING] => article/18/
    [SCRIPT_URL] => /article/18/
    [REDIRECT_SCRIPT_URL] => /article/18/
    

    For me, I would have the path of deliberate pages (like an "about us" page or whatever) saved in a database in order to be able to look it up using the path, but if not there, as in this case, then you deal with the path further:

    # Assign one of the server paths that is most reliable
    $path  = $_SERVER['REDIRECT_URL'];
    # Check if there is a path that matches a database path
    $valid = $this->query("SELECT COUNT(*) AS count FROM `pages` WHERE `path` = ?",array($path))->getResults();
    # If there is a page that is in the database, show that one
    # Presumably this is what you mean by content and id programmically, ie.
    # it's a pre-designated page, not an article that needs to be broken down
    # but follows the same path pattern?
    if($valid['count'] == 1) {
        # Go about doing normal stuff
        # Stop by using die(), exit, or if in function/method, return
        # Idea is to stop at this stage of the script if successful
    }
    else {
        # Explode the query
        $parts = array_filter(explode('/',$path));
        # Check if both parts exist
        if(isset($parts[0]) && isset($parts[1])) {
            # Assign type
            $type = $parts[0];
            # Assign ID
            $id   = $parts[1];
            # Fetch the results (you'll want to sanitize or match from an array the $type value to avoid injection)
            $page = $this->query("SELECT * FROM `{$type}` WHERE `ID` = ?",array($id))->getResults();
            # Check if page is valid and display
            # Stop by using die(), exit, or if in function/method, return
        }      
    }
    
    # Send a 404 header and display a not found
    # Make the last thing happen show a 404 page by default  
    

    Anyway, this is basically what I do, but you can probably do a rewrite that will handle both scenarios from the htaccess file. I personally just have the one that funnels everything and I deal with the path and routing using PHP, then I don't have to create some user control to mess with editing the htaccess file if different scenarios are required down the line.

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

悬赏问题

  • ¥15 关于#MATLAB#的问题,如何解决?(相关搜索:信噪比,系统容量)
  • ¥500 52810做蓝牙接受端
  • ¥15 基于PLC的三轴机械手程序
  • ¥15 多址通信方式的抗噪声性能和系统容量对比
  • ¥15 winform的chart曲线生成时有凸起
  • ¥15 msix packaging tool打包问题
  • ¥15 finalshell节点的搭建代码和那个端口代码教程
  • ¥15 Centos / PETSc / PETGEM
  • ¥15 centos7.9 IPv6端口telnet和端口监控问题
  • ¥20 完全没有学习过GAN,看了CSDN的一篇文章,里面有代码但是完全不知道如何操作