【问题标题】:Url rewrite mod_rewrite questions网址重写 mod_rewrite 问题
【发布时间】:2013-08-30 04:41:34
【问题描述】:

在我的应用程序中,我想实现 URL 重写以使链接对 SEO 友好

1.http://example.com/item.php?act=view&id=192
2.http://example.com/feedback.php?id=146

1.http://example.com/items/itemsname
2.http://www.example.com/username

问题

1)我有点困惑,我是否需要将代码中的所有链接更改为http://example.com/items/itemsname 并使用重写将其转换为http://example.com/item.php?act=view&id=192

我可以将我的代码保留为 http://example.com/item.php?act=view&id=192,然后将其重写为转换为 http://example.com/items/itemsname(选项 2 看起来更现实,否则没有 .htaccess 将无法正常工作)

2)如何在 Apache 和 Php 中做到这一点?

【问题讨论】:

    标签: apache .htaccess mod-rewrite url-rewriting apache2


    【解决方案1】:

    你有几种方法可以做到这一点,我想说,你当前的 PHP 最简单的方法是将你的链接更改为这样的:

    http://example.com/items/id-itemsname
    http://example.com/id-username
    

    所以一个真实的例子应该是这样的:

    http://example.com/items/192-Wash-Machine
    http://example.com/feedback/146-Jon-Lin
    

    然后你可以很容易地使用这个规则来转换它:

    Options +FollowSymLinks -MultiViews
    
    RewriteEngine On
    RewriteBase /
    
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteRule ^items/([0-9]+)-.*$ /item.php?act=view&id=$1 [L]
    
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteRule ^feedback/([0-9]+)-.*$ /feedback.php?id=$1 [L]
    

    这样您就可以完全忽略标题,只从中获取 ID 并使用您当前的脚本,同时仍向用户显示标题。

    另一种方式就像你提到的那样,它看起来像这样:

    http://example.com/items/itemsname
    http://example.com/feedback/username
    

    然后您需要更改 PHP 以按名称查找反馈和项目,因此它们看起来像这样:

    http://example.com/item.php?act=view&name=Wash Machine
    http://example.com/feedback.php?username=Jon Lin
    

    规则是这样的:

    Options +FollowSymLinks -MultiViews
    
    RewriteEngine On
    RewriteBase /
    
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteRule ^items/([^/]+)/?$ /item.php?act=view&name=$1 [L]
    
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteRule ^feedback/([^/]+)/?$ /feedback.php?username=$1 [L]
    

    【讨论】:

    • RewriteCond 需要在我认为的每个条件结束时为 RewriteRule,非常感谢您的详细回答!
    • @Athanatos 那是我的错,这是一个错字,谢谢你发现它;)
    【解决方案2】:

    我有点困惑,我是否需要将代码中的所有链接更改为http://example.com/items/itemsname 并使用重写将其转换为http://example.com/item.php?act=view&id=192

    如果可以的话,你想这样做。这意味着对于每个被点击的链接,您没有另一层处理。

    翻译有点模棱两可。例如:

    /username -> /feedback.php?id=146

    我假设的“用户名”类似于“sam”,但“id”是一个数字。重写模块对这个映射一无所知,htaccess 文件中的任何内容都不知道用户名如何映射到 id 或项目名称如何映射到 id。唯一可以做的是使用在访问此映射的服务器/虚拟主机配置中定义的RewriteMap

    你最好做的是使用 php。将项目和用户名映射到 item.phpfeedback.php 脚​​本。让这些脚本根据名称找出 id。 并且让这些脚本检查请求 URI 以查看请求是否直接针对 php 文件,而不是针对 SEO 查找的 URL,并根据需要将它们重定向。

    你希望 mod_rewrite 做的唯一事情就是做正向映射:

    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond ^item/(.*)$ /item.php?act=view&name=$1 [L]
    
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond ^(.*)$ /feedback.php?name=$1 [L]
    

    在这里,您将查找“name”参数,将它们映射到您需要的 ID,然后正常进行。

    【讨论】:

      【解决方案3】:

      这将对您有所帮助:URL Rewrites and 301 Redirects - How Does It All Work?

      就个人而言,我认为正确的方法是更改​​所有链接并使用 .htaccess 文件重写 url(显然,您需要在重写后将 nice-name [a.k.a slug] 转换为 id)。我尽量避免重定向,除非它们是 100% 必要的,但事实并非如此。像这样的:

      .htaccess:

      RewriteRule ^items/([0-9a-zA-Z\-\_].*)$ item.php?act=view&slug=$1 [L]
      

      关于链接,您可以手动(我推荐)或通过 JavaScript 更改它们,在用户点击后制作某种翻译功能。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-03-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-02-23
        相关资源
        最近更新 更多