【问题标题】:How do I create dynamic URLs?如何创建动态 URL?
【发布时间】:2011-10-21 05:54:02
【问题描述】:

我有一个允许用户写博客和提问的社交网络。我想创建动态 URL,通过 PHP 在 URL 的末尾发布博客的标题或问题。

例子:

www.blah.com/the_title_here

寻找最干净最有效的方法来完成此任务。

【问题讨论】:

    标签: php html css url


    【解决方案1】:

    使用数据库来做到这一点会是悲伤 :( 在很多情况下,您不需要查找数据库,而您将使用此方法。例如:-www.blah.com/signup(这里没有意义)。而且数据库连接会消耗资源,严重的资源......

    RewriteEngine on
    RewriteRule ^(.+)$ index.php?slug=$1
    

    如马丁所示,为您提供路径或蛞蝓。

    大多数框架使用文件系统来实现更清晰的 URL。 一个文件夹存放所有文件和 理论上类似的东西

    <?php
    $default = "home";
    //function to make sure the slug is clean i.e. doesnot contain ../ or something
    if(isset($_GET['slug'])) $slug = clean($_GET['slug']);
    if(!isset($slug)) $slug = $default;
    $files = explode('/',$slug);// or any other function according to your choice
    $file = "./commands/".$files[0].".php";
    if(file_exists($file))
        require_once($file);
    else
        require_once("./commands/".$default.".php");
    

    您可以根据需要将其简单到复杂。您甚至可以像 Martin 所做的那样使用数据库来确定默认情况,但这应该在 $default 中,而不是您使用的第一个逻辑...

    这样做的好处

    1. 比查询数据库快得多
    2. 您可以进行很多扩展。纵向如:site.com/users/piyushmishrasite.com/forums/mykickassforum 甚至更深层次如 site.com/category/category-name/post-name/comments/page-3
    3. 您可以更轻松地设置库和包。水平缩放(添加更多目录进行检查,每个目录可以设置一个/多个模块)例如:./ACLcommands/users.php./XMLRPC/ping.php

    【讨论】:

      【解决方案2】:
      "www.blah.com/$id/".preg_replace('/^[a-z-]+/','',preg_replace('/[ ,;.]+/','-',strtolower($title)))
      

      并且只使用$id

      来自标题

      "How do I create dynamic URLs?"

      它创建网址

      www.blah.com/15/how-do-i-create-dynamic-urls

      【讨论】:

      • 看起来很抽象?这到底是在做什么?
      • 来自标题“如何创建动态 URL?”创建网址:www.blah.com/15/how-do-i-create-dynamic-urls
      【解决方案3】:

      有很多开源软件可以做到这一点,您可以查看 WordPress.org 或 MediaWiki.org 来做到这一点。您需要结合使用 .htaccess 或 Apache 配置设置来向它们添加 mod_rewrite 规则。

      接下来,您将需要 Martin Bean 所写的控制器文件来查找帖子...但请确保正确转义/清理/验证输入,否则如果您有 JavaScript,则可能容易受到 SQL 注入或 XSS 攻击在您的网站上。

      所以最好使用 id 方法,并且只将 slug 用于漂亮的 url 目的。 WordPress.org 软件还建议,一旦您有很多帖子,仅靠蛞蝓就会变慢。因此,您可以使用www.blah.com/slug-phrase-goes-before-the-numeric_id 的组合并编写一个正则表达式来匹配:.*(\d+)$

      【讨论】:

        【解决方案4】:

        您通常会将 URL 友好的“slug”存储在数据库行中,然后有一个 PHP 脚本来查找与该 slug 匹配的帖子。

        例如,如果您有一个名为 index.php 的脚本,它采用了一个名为 slug 的参数...

        <?php
        if (isset($_GET['slug'])) {
            $sql = "SELECT * FROM `your_table` WHERE slug = ? LIMIT 1";
            $smt = $pdo->prepare($sql);
            $smt->execute(array($_GET['slug']));
            $row = $smt->fetchObject();
            // do something with the matching record here...
        }
        else {
            // display home page
        }
        

        ...然后您可以使用 .htaccess 重写请求:

        RewriteEngine on
        RewriteRule ^(.+)$ index.php?slug=$1
        

        【讨论】:

          猜你喜欢
          • 2011-12-19
          • 1970-01-01
          • 2023-03-11
          • 2015-02-18
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多