2011-05-03 36 views
9

问题:使用Kohana的/PHP开发其他公司托管网站使用APACHE RewriteRule不会覆盖REQUEST_URI吗?

上午。 我让客户在他们的DNS服务器中输入CNAME条目以指向我的域名。例如。 http://invites.somecompany.com指向http://www.mydomain.com

因此,%{HTTP_HOST}我的Apache服务器上的条目是 'invites.somecompany.com'

我想重写http://invites.somecompany.com/invitehttp://www.mydomain.com/invites/invite

即使阿帕奇似乎这样做, $ _SERVER ['REQUEST_URI']仍然是“/”。 问题是Kohana使用$ _SERVER ['REQUEST_URI']将请求路由到相应的控制器代码。在这种情况下,它将它路由到基地索引控制器,而不是'邀请'控制器。

事实:

Apache的mod_rewrite的指令,我使用(在.htaccess文件): -

RewriteCond %{HTTP_HOST} !^www.mydomain.com$ 
RewriteCond %{REQUEST_URI} !.*invites.* 
RewriteRule ^(.*)$ invites/$1 

# For Kohana 
RewriteRule .* index.php?kohana_uri=$0 [PT,QSA,L] 
在index.php

,我做的:

var_dump($_SERVER); 

我得到:

'REQUEST_URI' => string '/', 
'QUERY_STRING' => string 'kohana_uri=invites/index.php&kohana_uri=invites/invite' 
'REDIRECT_QUERY_STRING' => string 'kohana_uri=invites/invite' 

所以mod_rewrite不会修改REQUEST_URI?

极品:

'REQUEST_URI' => 'invites/invite', 
'QUERY_STRING' => string 'kohana_uri=invites/invite', 

如何获得呢?

====================== 编辑

重写日志条目: -

strip per-dir prefix: /Users/project/invite -> invite 
applying pattern '^(?:application|modules|system)\b.*' to uri 'invite' 
strip per-dir prefix: /Users/project/invite -> invite 
applying pattern '\.git' to uri 'invite' 
strip per-dir prefix: /Users/project/invite -> invite 
applying pattern '^(.*)$' to uri 'invite' 
rewrite invite -> invites/invite 
add per-dir prefix: invites/invite -> /Users/project/invites/invite 
strip per-dir prefix: /Users/project/invites/invite -> invites/invite 
applying pattern '.*' to uri 'invites/invite' 
rewrite invites/invite -> index.php?kohana_uri=invites/invite 
add per-dir prefix: index.php -> /Users/project/index.php 
strip document_root prefix: /Users/project/index.php -> /index.php 
internal redirect with /index.php [INTERNAL REDIRECT] 
strip per-dir prefix: /Users/project/index.php -> index.php 
applying pattern '^(?:application|modules|system)\b.*' to uri 'index.php' 
strip per-dir prefix: /Users/project/index.php -> index.php 
applying pattern '\.git' to uri 'index.php' 
strip per-dir prefix: /Users/project/index.php -> index.php 
applying pattern '^(.*)$' to uri 'index.php' 
rewrite index.php -> invites/index.php 
add per-dir prefix: invites/index.php -> /Users/project/invites/index.php 
strip per-dir prefix: /Users/project/invites/index.php -> invites/index.php 
applying pattern '.*' to uri 'invites/index.php' 
rewrite invites/index.php -> index.php?kohana_uri=invites/index.php 
add per-dir prefix: index.php -> /Users/project/index.php 
initial URL equal rewritten URL: /Users/project/index.php [IGNORING REWRITE] 
+0

那是怎样的mod_rewrite的作品。 – zerkms 2011-05-03 04:20:47

+0

hmmmmmmmmmmmmmm – Ajoy 2011-05-03 04:26:25

回答

-1

删除我以前的答案,因为它是错误的。感谢文档链接,学到了新的东西。

删除QSA标志:

# For Kohana 
RewriteRule .* index.php?kohana_uri=$0 [PT,L] 

Per the Docs

'qsappend | QSA'(查询字符串追加) 此标记强制重写引擎 追加的查询字符串的一部分 将字符串替换为现有的 字符串,而不是替换它。使用 当您想通过重写规则将更多数据添加到查询字符串 时。

应该注意到,第一次。

+0

不正确。检查http://httpd.apache.org/docs/1.3/mod/mod_rewrite.html#RewriteRule“反向引用是$ N(N = 0..9)标识符,它将被第N组匹配的模式“。 – Ajoy 2011-05-03 05:22:06

+0

我不会与文档争论,但我从未*看过使用过的$ 0。另外,你正在按照之前的规则说的去做。为什么不一致? – bradym 2011-05-03 05:39:03

+0

我以前使用过$ 0,它可以工作(和preg_match中的一样)。不一致是我的不好,但即使我保持一致(全部使用0美元),结果仍然是一样的。 – Ajoy 2011-05-03 05:50:09

1

1)如果你手动调用它,这个链接是否工作? http://www.mydomain.com/invites/invite

2.)RewriteCond %{HTTP_HOST} !^www.mydomain.com$需要转义像RewriteCond %{HTTP_HOST} !^www\.mydomain\.com$

3.)RewriteRule .* index.php?kohana_uri=$0 [PT,QSA,L]是一个无限循环的index.php作为配合到该正则表达式.*,太。

4.)您需要R标志将用户重定向到邀请/ RewriteRule ^(.*)$ invites/$1 [R=301]%{REQUEST_URI}与浏览器地址栏中的uri相同。

5.)如果你不想重定向访问者,你可以“破解”kohana系统,并在index.php的第一行设置$_SERVER['REQUEST_URI'] = $_GET['myURI'];,如果这将是唯一让它运行的选项。您可以通过mod_rewrite填写myURI

+0

谢谢@mgutt。 5)是我最终做的。 – Ajoy 2011-05-03 17:26:46

+0

我学到了另一个有趣的小知识:如果您在.htaccess文件中重写规则,它们会运行两次。另一种方法是将重写规则插入到httpd.conf文件中,但随后我不断收到'400错误请求'错误。 – Ajoy 2011-05-03 17:27:58

0

由于mod_rewrite的工作方式,您不能立即在$_SERVER['REQUEST_URI']中使用它。如果你感到快乐修改$_SERVER(这有时被认为是一个坏主意),怎么是这样的:

$_SERVER['REQUEST_URI'] = $_GET['kohana_uri']; 
$_SERVER['QUERY_STRING'] = $_SERVER['REDIRECT_QUERY_STRING'];