重定向到 .htaccess 中的絕對 URL 在 OpenShift 上傳回錯誤的主機名

重定向到 .htaccess 中的絕對 URL 在 OpenShift 上傳回錯誤的主機名

我正在建立一個網站開放式班次。它在 Apache 2.2.15 下運行,但我無法存取 Apache 根目錄或日誌,因此我嘗試在網站根目錄的 .htaccess 檔案中模擬虛擬目錄。大部分工作正常,但有一個我無法弄清楚的重定向問題。

網站的架構如下:

應用程式根/儲存庫- .htaccess 所在的網站根目錄
應用程式根目錄/repo/domain_example
應用程式根目錄/repo/domain_example/main- 主網站(WordPress)

在 WordPress 中,我的部落格位於 www.example.com/blog 下,但在遷移到 WordPress 之前,我在 blogs.example.com 子網域中有幾篇文章。為了維護鏈接,我在 .htaccess 中設定了重定向命令。他們在我以前的共享託管提供者處工作得很好。他們甚至在 OpenShift 上也運作得很好我新增了 www.example.com 作為 OpenShift 別名。但是,自從添加別名後,我無法強制 .htaccess 返回 www。如果原始主機名稱以 blogs 開頭。

來自阿帕契重定向文檔

新 URL 應該是以方案和主機名稱開頭的絕對 URL。在 Apache HTTP Server 2.2.6 及更高版本中,也可以使用以斜線開頭的 URL 路徑,在這種情況下,將新增目前伺服器的方案和主機名稱。那麼任何以 URL-path 開頭的請求都會向目標 URL 位置處的用戶端傳回重新導向請求。

我的期望:如果我提供絕對 URL 作為目標,則重定向應將該 URL 傳回給用戶端。然後,用戶端可以使用正確的 URL 重新發出其請求。

怎麼了:重定向正在發生(我在 Firebug 中看到 302),但它指向來源域,而不是目標域。就像它正在執行第二位(使用“當前伺服器的方案和主機名稱”),即使我提供了絕對 URL。

這是我的 .htaccess 的摘錄:

Options +FollowSymLinks -MultiViews
RewriteEngine On
RewriteBase /

# This section from https://my.bluehost.com/cgi/help/347#redirect
RewriteCond %{HTTP_HOST} ^(www.)?example\.com$
RewriteCond %{REQUEST_URI} !^/domain_example/
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ /domain_example/main/$1
RewriteCond %{HTTP_HOST} ^(www.)?example\.com$
RewriteRule ^(/)?$ domain_example/main/index.php [L] 

# blogs.example.com redirects

redirect 302 /mark/post/Check-Windows-Time-Settings.aspx http://www.example.com/blog/2010/05/check-windows-time-settings/

有了 .htaccess,當我瀏覽到http://blogs.example.com//mark/post/Check-Windows-Time-Settings.aspx並查看 Firebug 中的回應,我看到 302 重定向將是http://blogs.example.com/blog/2010/05/check-windows-time-settings/。但這並不存在,所以我得到了 404 Not Found。為什麼它會出現在部落格上。當我告訴它去 www. ?

我想知道 OpenShift 別名是否以某種方式覆蓋了重定向,但根據重定向文件:

重定向指令優先於 Alias 和 ScriptAlias 指令,無論它們在設定檔中的順序為何。

我還嘗試添加顯式陷阱並重寫以 blogs.example.com/blog/ 開頭的路徑(這就是重定向顯然返回的內容):

RewriteCond %{HTTP_HOST} ^blogs\.example\.com/blog/ [NC]
RewriteRule ^(.*)$ http://www.example.com/blog/$1 [L,R=302]

我仍然收到 404 Not Found 的訊息。事實上,即使是最基本的網址,http://blogs.example.com/blog/,給 404。

在這種情況下如何獲得重定向以發揮作用?

2015 年 5 月 27 日更新#1

嘗試在重寫區塊中使用“not”邏輯:

RewriteCond %{HTTP_HOST} !^www\.example\.com/blog/ [NC]
RewriteRule ^(.*)$ http://www.example.com/blog/$1 [L,R=302]

這會導致無限重定向循環,在放棄之前進行 20 次重定向。每個重定向仍然以http://blogs.example.com所以有些東西仍然阻止 RewriteRule 在 URL 的開頭寫入「www」。

如果我用以下命令終止 NOT 邏輯,結果相同$

RewriteCond %{HTTP_HOST} !^www\.example\.com/blog/$ [NC]
RewriteRule ^(.*)$ http://www.example.com/blog/$1 [L,R=302]

2015 年 5 月 27 日更新#2

@Quasidynamic 指出 %(HTTP_HOST) 只包含主機名,後面不包含任何內容。所以我嘗試只選擇以以下開頭的網址www.example.com/blog

RewriteCond %{HTTP_HOST} ^blogs\.example\.com$ [NC]
RewriteCond %{REQUEST_URI} ^/blog/$ [NC]
RewriteRule ^(.*)$ http://www.example.com/blog/$1 [R=302,L]

沒有無限循環,但重定向仍然轉到blogs.,然後重寫無法將其發送到www.

2015 年 5 月 28 日更新

根據 @Quasidynamic 的請求,試試這個區塊:

RewriteCond %{HTTP_HOST} ^blogs\.example\.com$ [NC]
RewriteRule ^(.*)$ http://www.example.com/blog/$1 [R=302,L]

正如現在所預期的,當我瀏覽到 時blogs.example.com,它被重定向到blogs.example.com/blog/。因為它仍然與 RewriteCond 匹配,所以它會被重定向到blogs.example.com/blog/blog/.無窮無盡。它永遠不會轉到www.example.com,這是我從一開始就遇到的根本問題:一旦我添加為 OpenShift 子網域,無論我嘗試什麼,blogs.example.com我都無法再使用 .htaccess 重定向到。www.example.com

答案1

如果您的[舊]是blogs.example.com並且[目標]是www.example.com/blog:

RewriteCond %{HTTP_HOST} blogs.example.com$ RewriteRule ^(.*)$ http://www.example.com/blog/$1 [R=301,L]

你已經很接近了,但你試圖匹配 /blog 的請求,但該請求不會存在,這僅在 [目標] 網站上,據我了解你的情況。

使用代碼 301 - “狀態 301 表示資源(頁面)已永久移動到新位置。客戶端/瀏覽器不應嘗試請求原始位置,而應從現在開始使用新位置。”從

https://stackoverflow.com/questions/1393280/http-redirect-301-permanent-vs-302-temporary

相關內容