具有多语言支持的 PHP 路由

标签 php mod-rewrite url-routing multilingual seo

我目前正在框架上创建 CMS。我已经制作了我的 .htaccess 文件,它看起来像这样:

<IfModule mod_rewrite.c>
RewriteEngine On

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d

RewriteRule ^([A-Za-z]+)/(.*)$ index.php?url=$1 [PT,L]

</IfModule>

我的问题是:

1) 可以使用普通的 MVC URL 访问我的页面: http://example.com/pages/view/ {the-shorttag-of-the-page}

2) 我的页面也可以通过路由访问: http://example.com/p/ {the-shorttag-of-the-page}

我真正需要实现的是我可以通过两种方式访问​​它: http://example.com/ {the-shorttag-of-the-page} 或者有语言支持 http://example.com/ {lang}/{the-shorttag-of-the-page}

我的问题是我不想更改 mod_rewrite - 我更想在 PHP 中创建路由,但我无法找到如何路由到 PageController->view() 方法的解决方案条件中的静态字母(上例中的“p”)。

你明白我的问题了吗? 你有什么提示可以引导我朝着正确的方向前进吗?

最佳答案

这听起来像是您需要实现某种路由器。

我自己遇到过,这就是我如何让它工作得很好:

一些路由器类解析 URL。它将 URL 部分 (/en/controller/action/param1/paramval1/) 分解成片段。它确定语言代码(如果未提供则默认)、 Controller 、操作等。 路由器还向系统的其他部分提供信息( Controller 、 Action 名称、参数),尽管您可以为此目的实现特殊类(例如请求)。

现在系统的不同部分可以通过 Router 或 Request 类访问给定的信息。从这里开始,实现多语言站点应该很容易。

再次强调,重要的部分是将 URL 映射到 Controller 和操作。当然,如果您不想要像 /controller/action/parameter1 这样的 URL,您应该有一些映射表(XML 文档/数据库表)将 stub (页面短标记)映射到 Controller 和操作.路由器读取这个表并根据给定的规则确定 Controller 、 Action 和其他参数。

希望我没有把事情复杂化太多:)

更新:

至于我自己,我已经使用 XML 文件实现了映射。让我进一步解释一下:路由器负责解析 URL。通常,您的 URL 会包含 Controller 和操作名称(在您的例子中,pages 是 Controller ,view 是操作)。

现在在您的情况下,您只需要一个 stub ,因此路由器必须以某种方式获取有关正在调用哪个 Controller 和操作的信息。这就是映射的目的,将 stub 映射到适当的 Controller 和操作。

我将其实现为静态路由,手动写入 XML 文件,但您可以使用某种插件类来检查 stub 是否确实与页面相关。如果不是,则可能意味着两件事:它是 Controller 或请求无效。

让我进一步谈谈冲突:如果 stub 与任何 Controller 的名称相同,就会发生冲突。您应该使用给定的 stub 呈现页面,还是调用 Controller ?这必须以某种方式解决,也许您可​​以通过编程方式限制用户拥有包含此类 stub 的页面。

此外,下次您深入研究使用 PHP 进行应用程序开发时,我建议您使用一些著名的 PHP 框架(如果您还没有,当然可以),例如Zend、Kohana 或 CodeIgniter。它们都提供路由器和许多其他组件,使开发应用程序变得更容易、更快和更安全。

关于具有多语言支持的 PHP 路由,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5859197/

相关文章:

Php - MySQL 从表中选择数据,然后更新同一个表

php - 重写 php switch 语句的 url

apache - .htaccess 将查询字符串重写为路径

javascript - 在 AngularJS 中路由时包含 Controller

javascript - 从 mysql 中提取数据并在 javascript 中使用它们

php - MySql如何通过过滤多列来限制多个数字?

ruby-on-rails - Rails 嵌套资源和 :path => "/"

asp.net-mvc - 路由、命中错误 Action

php - Magento:构建库存中所有可配置产品的自定义产品集合

.htaccess - htaccess 将所有流量重定向到 http(非 ssl)