使用APACHE RewriteRule不会覆盖REQUEST_URI?

时间:2011-05-03 03:47:05

标签: php apache mod-rewrite dns kohana

问题:

使用 Kohana / PHP为其他公司开发托管网站。 我让客户在他们的DNS服务器中输入CNAME条目以指向我的域。例如。 http://invites.somecompany.com指向http://www.mydomain.com

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

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

即使Apache似乎这样做,$ _SERVER ['REQUEST_URI']仍然是“/”。 问题是Kohana使用 $ _ SERVER ['REQUEST_URI'] 将请求路由到适当的控制器代码。在这种情况下,它会将其路由到 base 索引控制器,而不是“邀请”控制器。

事实:

我正在使用的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]

3 个答案:

答案 0 :(得分: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'];,如果这是获取它的唯一选择运行。 myURI可以根据需要通过mod_rewrite填充。

答案 1 :(得分:0)

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

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

答案 2 :(得分:-1)

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

删除QSA标志:

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

Per the Docs

  

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

第一次应该注意到了。