【问题标题】:Creating dynamic URLs in htaccess在 htaccess 中创建动态 URL
【发布时间】:2011-05-01 16:45:29
【问题描述】:

我正在尝试编写一个 .htaccess 文件,以使我的 URL 对搜索引擎更具吸引力。我基本上知道如何做到这一点,但我想知道如何动态地做到这一点。

我的网址通常如下所示:

view.php?mode=prod&id=1234

我想做的是从 url 中获取 id,进行数据库查询,然后将从数据库返回的标题放入 url。类似:

/products/This-is-the-product-title

我知道有些人已经使用 phpbb 论坛 URL 和主题来实现这一点,我试图追踪代码直到它用新的标题字符串 URL 替换实际 URL,但没有运气。

我知道我可以只用 id 重写 URL:

RewriteRule ^view\.php?mode=prod&id=([0-9]+) /products/$1/

PHP 中有没有办法覆盖显示的 URL?

【问题讨论】:

    标签: php .htaccess


    【解决方案1】:

    目前,您想知道如何将丑陋的 URL(例如 /view.php?mode=prod&id=1234)转换为漂亮的 URL(例如 /products/product-title)。开始反过来看这个。

    您想要的是有人输入/products/product-title 以实际将他们带到/view.php?mode=prod&id=1234 可以访问的页面。

    即您的规则可能如下:

    RewriteRule ^products/([A-Za-z0-9-])/?$ /view.php?mode=prod&title=$1
    

    然后在 view.php 中根据title 查找id。然后照常进行。

    【讨论】:

    • 这是否意味着我需要返回并编辑我现有的站点间链接?
    • 是的,确实如此。我想这使得这个答案更像是一个未来的解决方案。要使旧链接正常工作,您可以根据您拥有的id 进行查找,找到标题,然后重定向到/products/looked-up-title。为此,.htaccess 没有变化,只是你的 view.php
    • 好吧,我试了一下,使用您在上面发布的重写规则,但我收到 404 错误。
    • 只是出于好奇,我做错了什么:RewriteRule ^/shipping/$ /index.php?mode=shipping?因为我用这个简单的也得到了 404
    • 我在RewriteRule 上犯了一个错误。它确实以^/products/... 开头,但第一个斜杠会使其不起作用,它应该是^products/...(我已经更新了我的答案)
    【解决方案2】:

    一种方法,就像大多数 mvc 框架一样。您可以将所有页面重定向到同一个 index.php 文件,并使用脚本来确定要加载的页面。

    .htaccess

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

    你的 php 文件会有一个像这样的脚本:

      // get the url
      $uri = (isset($_SERVER['REQUEST_URI']))?$_SERVER['REQUEST_URI']: false;
      $query = (isset($_SERVER['QUERY_STRING']))?$_SERVER['QUERY_STRING']: '';
      $url = str_replace($query,'',$uri); // you can edit this part to do something with the query
      $arr = explode('/',$url);
      array_shift($arr);
    
      // get the correct page to display
      $controller =!empty($arr[0])?$arr[0]:'home'; // $arr[0] could be product/ 
      $action = isset($arr[1]) && !empty($arr[1])?$arr[1]:'index'; // $arr[1] can be product-title
        }
    

    当然,您必须使用此代码来塑造您的应用程序

    希望对你有帮助

    【讨论】:

      【解决方案3】:

      一种方法是输出 Location: 标头以强制重定向到所选 URL。

      【讨论】:

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