【发布时间】:2012-12-09 02:47:01
【问题描述】:
这个问题可能看起来很吓人。不,这很简单,但解释得很透彻。所以请继续阅读。
我需要制作一个多语言页面(英语和西班牙语),并且我想使用此段来路由每种语言:
mysite/zh/mycontroller/mymethod
这些是我在 .htaccess 中制定的规则及其描述:
# Rewrite url removing language segment and appending it as a request variable
RewriteRule ^(es|en)/(.*) $2?lang=$1 [L]
# Remove index.php from URL
RewriteCond $1 !^(index.php|css|images|scripts|robots.txt|sitemap.xml)
RewriteRule ^(.*)$ index.php/$1 [L]
有些事情我做得不对:
第一条规则是正确地创建请求变量 lang,但是仍然在路由 URL 时没有删除语言段 (en|es),这 导致错误,因为 Codeigniter 假设(所以我认为)期望一个名为 "en" 或 "es" 的控制器。我最终可以摆脱 CI 路线中的这一部分,但由于我是在 .htaccess 中进行的,因此无需再次重复。据我所知,这部分在重写后不应该再存在了。
注意:由于以下原因,我不想在这种特殊情况下使用 CI 路由:
- 默认情况下,它们不适用于附加的请求变量,
- 我不想在公共 URL 中使用可见的请求变量(无法在配置文件中启用它们),
- 将请求变量作为参数段传递意味着需要在索引或其他任何请求的方法中检索它,
- 我想先在构造函数中处理它(在其中检索 $_GET('lang'))。
以防万一,这些是在输入 index.php 时转储的 $_GET 和 $_SERVER 变量(不是全部):
示例网址:http://localhost/mysite/en/portfolio
$_GET:
Array
(
[lang] => en
)
$_SERVER:
Array
(
[DOCUMENT_ROOT] => C:/xampp/htdocs
[CONTEXT_DOCUMENT_ROOT] => C:/xampp/htdocs
[SCRIPT_FILENAME] => C:/xampp/htdocs/mysite/index.php
[REDIRECT_QUERY_STRING] => lang=en
[REDIRECT_URL] => /mysite/portfolio
[REQUEST_METHOD] => GET
[QUERY_STRING] => lang=en
[REQUEST_URI] => /mysite/en/portfolio
[SCRIPT_NAME] => /mysite/index.php
[PATH_INFO] => /portfolio
[PATH_TRANSLATED] => C:\xampp\htdocs\portfolio
[PHP_SELF] => /mysite/index.php/portfolio
)
没有语言段的相同 URL 可以完美运行并进入 Portfolio 控制器:
http://localhost/mysite/portfolio
欢迎任何帮助。
【问题讨论】:
-
我对 CI 不是很熟悉,但是,如果我理解正确的话,你想得到一个 [REQUEST_URI] => /mysite/portfolio?
-
@Muc:我想这就是我想要的,只要它是 Codeigniter 用来路由请求以检索控制器及其方法的东西。这是 Codeigniter 的默认行为:
www.site.com/controller/method/param1/param2/..
标签: php apache codeigniter mod-rewrite