使用mod_rewrite AND mod_proxy时获取原始REQUEST_URI

时间:2011-04-01 23:43:33

标签: codeigniter mod-rewrite

我正在使用custom.conf文件对网站的某些功能进行重写和codeigniter,主要是文章。

我的原始网址被重写,所以我有http://example.com/article-a101,这使用custom.conf文件重写为codeigniter / article / read / 101。我想我必须使用mod_rewrite中的[P]标志将其作为代理调用发送,以使其在codeigniters .htaccess文件中再次重写。一旦它点击代码点火器.htaccess,它就使用该mod重写结构来调用索引文件,并使用文章控制器和101中的读取函数作为参数发送。

我想弄清楚的是如何在地址栏中获取原始网址,因为它不在$ _SERVER变量中。因为我在第一次重写时使用了[P],所以request_uri有codeigniter / article / read / 101。

custom.conf
    RewriteRule ^/([_a-zA-Z0-9-]+)-a([0-9]+)$ /codeigniter/article/read/$2 [P,L]

codeigniters .htaccess, fairly basic    
    RewriteRule ^(.*)$ index.php?/$1 [L]

这是我当前的解决方案,我知道必须有一个更好的方法

RewriteRule ^/([_a-zA-Z0-9-]+)-a([0-9]+)$ /codeigniter/article/read/$2?orig_url=%{REQUEST_URI}&%{QUERY_STRING} [P,L]

这对用户来说是隐藏的,我可以通过查询字符串访问原始网址,但看起来不是一个优雅的解决方案。

1 个答案:

答案 0 :(得分:1)

我很确定你不能用mod_rewrite以其他方式做到这一点 但你可以用codeigniter路由来做。

$route['^([_a-zA-Z0-9-]+)-a([0-9]+)$'] = "article/read/$2";

假设您的控制器名为article且您的函数名为read

如果您访问过/article-a101

然后$this->uri->uri_string();将返回article-a101(原始网址,现在应该在您的网址栏中)

$this->uri->ruri_string();将返回article/read/101(您实际所在的位置)