2011-05-03 55 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'];