如何使用.htaccess和多个参数创建更好的URL?

时间:2010-04-23 13:19:26

标签: url .htaccess mod-rewrite 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实现这一目标的最佳方法是什么? 我觉得特别难以实现:

  • 结合两个参数,页面和 区域设置
  • 将ISO区域设置EN_en转换为网址中的en
  • 我应该如何写链接?使用结果URL或index.php?页面... 控制器方案?

修改: 我疯了!我不能让它工作!!觉得这么愚蠢......但是,任何人都可以帮我解决确切的.htaccess文件吗?我需要把它关掉吗?谢谢!

2 个答案:

答案 0 :(得分:2)

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文件中。

答案 1 :(得分:1)

编辑:我在其中一台服务器上测试了这一点。这对我来说很好:

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

这可以帮助你完成大部分工作,但它不会进行语言环境转换(en =&gt; 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路由功能。例子: