重写mod_rewrite和Codeigniter的问题

时间:2012-12-21 14:00:24

标签: php apache codeigniter mod-rewrite

这个问题可能看起来令人生畏。不,这很简单,但彻底解释了。所以请继续阅读。

我需要制作一个多语言页面(英语和西班牙语),我想使用此段来路由每种语言:

mysite的/的 EN / 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路由:

  • 默认情况下,它们不会附加请求变量
  • 我不想在公共网址中使用可见的请求变量(无法在配置文件中启用它们),
  • 将请求变量作为参数段传递将意味着需要在索引或其他任何请求的方法中检索它,
  • 我想在构造函数之前处理它(在其中检索$ _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

欢迎任何帮助。

2 个答案:

答案 0 :(得分:0)

尝试此代码一次.........

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

答案 1 :(得分:0)

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