【问题标题】:How can I get use outside information in url rewrites?如何在 url 重写中使用外部信息?
【发布时间】:2011-12-23 05:54:22
【问题描述】:

希望你们中的一些 .htaccess 专家可以帮助我解决这个问题。我以前从来没有花时间弄乱 .htaccess,所以我有点迷茫。

基本上我想获取一个链接,例如 example.com/index.php?id=3 并将其转换为http://example.com/pagename/

我可以轻松地更改它,以便将链接转换为 http://example.com/directory/3 或类似的东西,但我真的不明白人们如何完成我正在寻找的更改。我知道 Wordpress 对他们的网址做了类似的事情,但是他们如何访问帖子名称信息?

【问题讨论】:

    标签: wordpress .htaccess url mod-rewrite rewrite


    【解决方案1】:

    Wordpress 通过将无法解析为文件或目录的所有内容重写为 index.php 来做到这一点,如下所示:

    RewriteEngine On
    RewriteBase /
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteRule . /index.php [L]
    

    index.php 读取请求的 URI 并计算出如何处理它。同时,wordpress 知道这些 URL 正在被重写,因此它使用干净的 SEO 友好 URL(例如 http://example.com/pagename/)呈现页面。

    对于您的示例,mod_rewrite 本身无法知道 id=3 等同于 pagename,除非您对一堆单独的 RewriteRules 进行硬编码。你可以做什么让 index.php 接受 pagename 所以你的规则看起来像这样:

    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteRule ^(.+)$ /index.php?page=$1 [L]
    

    现在要在您的内容中生成干净的 SEO 友好 URL。在内容管理系统中,页面本身通常以某种 ID 存储在数据库中。假设一个页面“Test Page”,数据库中的 ID 为“5”,创建于 2011 年 10 月 10 日。当 CMS 需要生成链接时,它会在数据库中查找并构造链接为/2011/10/Test_Page。

    因此,当您转到首页时,index.php 会生成指向其所有页面的链接,对于“测试页”,链接会显示 /2011/10/Test_Page,当有人点击该链接时,apache 会使用规则如RewriteRule ^([0-9]+)/([0-9]+)/(.+)$ /index.php?year=$1&month=$2&title=$3 [L] 将URL 重写为/index.php?year=2011&month=10&title=Test_Page。 index.php 脚本在数据库中查找正确的页面并将其返回给浏览器。这对于每个 CMS 都会有所不同。本质上,.htaccess 不会知道存储在数据库中的任何内容,但它可以重写链接,以便将所需的信息(如“id”或“page”)传递给脚本。由脚本决定返回哪个页面和在该页面上生成干净的 SEO 友好链接。

    【讨论】:

    • 好的,假设我选择走 WP 路线并将所有内容重写为index.php。我仍然不太明白如何将 URL 重写为更干净的东西。我查看了 Wordpress 中的 rewrite.php 文件,看看他们是如何做到的,但是当它隐藏在复杂 CMS 的 2000 行文件中时,要理解一个困难的概念并不容易。
    • 查看我的编辑。如何生成干净的 SEO 友好链接完全取决于您。这根本不是 .htaccess 或 apache 的一部分。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-07
    • 2018-05-12
    相关资源
    最近更新 更多