【问题标题】:Rewrite problems with mod_rewrite and Codeigniter使用 mod_rewrite 和 Codeigniter 重写问题
【发布时间】: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


【解决方案1】:

试试这个代码一次............

RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php/$1 [L]

【讨论】:

  • 这样我不会让 lang GET 变量知道数据必须以什么语言显示。
【解决方案2】:

尝试将RewriteRule ^(es|en)/(.*) $2?lang=$1 [L] 更改为RewriteRule ^(es|en)/(.*) index.php/$2?lang=$1 [L]

【讨论】:

  • 你好@swatkins。您建议的规则的行为完全相同。仅当我这样做时才有效:localhost/mysite/portfolio,但不适用于语言段 localhost/mysite/en/portfolio。请求变量已创建,但请求 uri 未重写以删除 "en"
猜你喜欢
  • 2013-05-06
  • 2013-04-04
  • 1970-01-01
  • 2011-02-23
  • 1970-01-01
  • 2013-01-24
  • 2013-09-30
  • 2013-11-23
  • 2014-10-20
相关资源
最近更新 更多