htaccess:嵌套的 wordpress 文件夾重定向
我已經嘗試了幾個小時,並且對此已經有點緊張了,所以我可能看不到明顯的東西。
我有兩個 WordPress 網站,一個是人們訪問我的域根目錄時看到的“主”頁面,一個是私人部落格:
www.example.com
和www.example.com/blog
在我的伺服器根目錄上,我想將兩個頁面組織在單獨的文件夾中,以保持乾淨。我命名的這些文件夾
wp-main
和wp-blog
. 要重定向我開始擺弄的域.htaccess
,但我似乎無法正確處理 -blog
是問題所在。使用此處main
的說明可以正常工作,但該部落格不會載入 WordPress 主題(顯示原始內容),也不會重定向到任何子文件夾。如果我去掉 的重定向規則,部落格索引會被載入,但仍然沒有子文件夾重定向。main
有人可以幫我嗎?
<IfModule mod_rewrite.c> RewriteEngine on RewriteBase / ## redirect for main RewriteCond %{HTTP_HOST} ^(www.)?example.com$ RewriteCond %{REQUEST_URI} !^/wp-main($|/)$ RewriteCond %{REQUEST_URI} !^/blog($|/)$ RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule ^(.*)$ /wp-main/$1 RewriteCond %{HTTP_HOST} ^(www.)?example.com$ RewriteRule ^(/)?$ wp-main/index.php ## redirect for blog RewriteRule ^blog(.*)$ /wp-blog/$1 </IfModule>
RewriteCond %{REQUEST_URI} !^/wp-main($|/)$ RewriteCond %{REQUEST_URI} !^/blog($|/)$
您應該刪除這兩個CondPatterns
$
末尾的(end-of-string anchor) 。否則,請求將被路由到,因為滿足上述條件(因為它與模式不匹配)。/blog/<something>``/wp-main/...``^/blog($|/)$
考慮顛倒你的邏輯並首先重寫
/blog
(更具體的URL)。(並使用L
標誌來防止額外的處理。)**更新:**嘗試以下操作…
我已經顛倒了邏輯,因此
/blog
首先處理(更具體的URL)。這避免了您在重寫主站點時必須明確避免。/blog
我還假設您只有一個域(我在之前的評論中詢問過) - 這避免了檢查Host
標頭(即HTTP_HOST
伺服器變數)的要求。如果您的帳戶確實有多個域,那麼您目前的指令無論如何都是不完整的。您不需要
<IfModule mod_rewrite.c>
包裝器,除非您的網站打算在沒有 mod_rewrite 的情況下執行(它不是)。潛在地,您所需要的只是:
RewriteEngine on # Rewrite blog site RewriteRule ^blog/?(.*)$ /wp-blog/$1 [L] # Rewrite everything else to the main site RewriteRule (.*) /wp-main/$1 [L]
幾個假設:
- 每個子目錄(
/wp-blog
和/wp-main
)都有自己的.htaccess
文件(使用 mod_rewrite 指令)——這可以防止重寫循環。- 這些 WordPress 安裝之外沒有靜態資源。所有靜態資源也被重寫。例如。
/images/foo.jpg
在內部被重寫/wp-main/images/foo.jpg
並被/blog/images/foo.jpg
重寫為/wp-blog/images/foo.jpg
等。您永遠不會引用/wp-main
或/wp-blog
直接在客戶端 HTML 中。如果在其他位置有共享靜態資源(例如/scripts
,真實文件根目錄下的子目錄),那麼您將需要額外的文件系統檢查(如果有太多的位置要列出)或在現有位置之前包含該位置的異常指令。例如:RewriteRule ^scripts/ - [L]
/blog
和/blog/
(帶有斜線)訪問您的部落格首頁(這樣可以避免被/blog
重寫到您的主站點)。理想情況下,只/blog/
應訪問您的部落格並/blog
重定向到此。這可以在部落格重寫之前通過額外的重定向來實現:# Rewrite blog site RewriteRule ^(blog)$ /$1/ [R=302,L] RewriteRule ^blog/?(.*)$ /wp-blog/$1 [L]
僅當您確定這是您想要的並且確認它可以正常工作時,才將
302
(臨時)更改為(永久)。301
301 被瀏覽器永久記憶體。然後,
.htaccess
相應子目錄中的每個文件應採用以下形式:RewriteEngine On RewriteRule ^index\.php$ - [L] RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule . index.php [L]
無需在替換中指定或
RewriteBase
包含子目錄。RewriteRule