【问题标题】:How to make a better URL with .htaccess and multiple parameters?如何使用 .htaccess 和多个参数制作更好的 URL?
【发布时间】:2011-02-11 12:47:11
【问题描述】:

我有一个很长的不友好 URL,我希望为网站改进 SEO:

http://www.site.com/sub-site/index.php?page=nameofpage&locale=en_EN

我想改用这个: http:// www.site.com/sub-site/en/nameofpage

所有的 URL 都以如下形式硬编码在链接中:

<a href="index.php?page=nameofpage&locale=en_EN">link</a>

使用 mod-rewrite 实现这一目标的最佳方法是什么? 我发现它特别难以实现:

  • 结合两个参数,页面和 语言环境
  • 在 URL 中将 ISO 语言环境 EN_en 转换为 en
  • 我应该如何编写链接?使用结果 URL 或 index.php?page... 控制器方案?

编辑: 我要疯了!我不能让它工作!感觉很愚蠢......但是,谁能帮我提供我需要的确切 .htaccess 文件来完成这个任务?谢谢!

【问题讨论】:

    标签: url .htaccess mod-rewrite seo


    【解决方案1】:

    mod_rewrite 是一个非常复杂的野兽。不过,这应该可以帮助您入门!只需阅读文档并使用它。你很快就会掌握它的窍门!

    <IfModule mod_rewrite.c>
        RewriteEngine On
        RewriteBase /
    
        # Checks to see if the user is attempting to access a valid file,
        # such as an image or css document. If this isn't true, it sends the
        # request to index.php
        RewriteCond %{REQUEST_FILENAME} !-d
        RewriteRule ^(.*)/(.*)$ index.php?locale=$1&page=$2
        RewriteRule ^(.*)$      index.php?page=$1
    </IfModule>
    

    编辑:您应该将其复制并粘贴到 .htaccess 文件中。

    【讨论】:

    • 这听起来可能很愚蠢,但是……我现在必须重做所有站点链接吗?如果可行,我是否应该将所有硬编码链接替换为新的 URL 方案?
    • 我注意到的第一件事是 CSS 样式表不再适用。此外,我无法让 URL 正常工作。我真的被困住了!
    • 一有机会我就会在测试服务器上使用它,看看我是否不能用更精确的.htaccess 文件编辑我的帖子。
    【解决方案2】:

    编辑:我在我的一台服务器上进行了测试。这对我来说很好:

    RewriteEngine On
    RewriteRule ^sub-site/([a-z_]+)/([a-z0-9_-]+)$ /sub-site/index.php?locale=$1&page=$2
    

    这可以帮助您完成大部分工作,但它不会进行语言环境转换 (en => en_EN),它只是将语言环境按原样传递给 PHP 脚本。使用 mod_rewrite,我推荐 RewriteMap;但是,如果您只有可以访问 .htaccess(例如在共享主机上),则不能使用 RewriteMap。

    那么,要完成语言环境转换,我认为最好在 PHP 端进行。您可以使用下面列出的框架之一,也可以自己动手。

    如果您确实可以访问虚拟主机配置,您可以创建一个文本文件,如下所示:

    en en_EN
    fr fr_FR
    ca fr_CA
    

    如果该文件位于 /path/to/localemap.txt,您将拥有:

    RewriteMap locales txt:/path/to/localemap.txt
    RewriteRule ^sub-site/([a-z_]+)/([a-z0-9_-]+)$ /sub-site/index.php?locale=${locales:$1|en_EN}&page=$2
    

    如果在地图中找不到任何内容,则默认为 en_EN。

    希望有帮助!


    如果您只是使用 .htaccess,那么 mod_rewrite 将轻松完成您想要的操作。

    您可能希望查看 RewriteMap 以了解您的类别或语言环境,尽管您可以直接获取 URL 的那部分并直接将其用作参数。下面是一个帮助您入门的示例:

    RewriteRule /sub-site/([a-z_]+)/([a-z0-9_]+) /sub-site/index.php?locale=$1&page=$2
    

    您确实希望缩小用于使它们更具体到您支持的语言环境和类别的正则表达式的范围,但我认为这是一个不错的起点。

    其他 PHP 框架,尤其是那些专注于 MVC 的框架,也提供了类似的 URL 路由功能。例子:

    【讨论】:

    • 是的,我不久前需要进行 mod-rewrite,但发现设置起来有点棘手。我想知道要添加哪些行,以便我的 URL 看起来像我想要的那样。
    • 即使使用您提到的框架,获得 OP 指定的“干净”网址的唯一方法是通过 mod_rewrite。
    • 一点也不;我提到框架的原因是你可以避免使用 mod_rewrite。例如,在“使用正则表达式”部分中查看 Kohana 文档。他可以轻松地在那里使用正则表达式并将其映射到他想要的任何内容。显然,语言环境和页面现在是 PHP 脚本的参数,所以很容易放入控制器并通过路由调用。
    • 啊,我们说的是同一件事。我的意思是,如果没有 mod_rewrite,就无法从 url 中删除 index.php,因此 url 不会是“干净的”。没有任何框架可以为您做到这一点。
    猜你喜欢
    • 2016-02-03
    • 2017-03-03
    • 2015-05-05
    • 2013-02-27
    • 1970-01-01
    • 2016-01-20
    • 1970-01-01
    • 2013-12-15
    • 1970-01-01
    相关资源
    最近更新 更多