Dot-Htaccess

htaccess:嵌套的 wordpress 文件夾重定向

  • March 2, 2019

我已經嘗試了幾個小時,並且對此已經有點緊張了,所以我可能看不到明顯的東西。

我有兩個 WordPress 網站,一個是人們訪問我的域根目錄時看到的“主”頁面,一個是私人部落格:

www.example.comwww.example.com/blog

在我的伺服器根目錄上,我想將兩個頁面組織在單獨的文件夾中,以保持乾淨。我命名的這些文件夾wp-mainwp-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(臨時)更改為(永久)。301301 被瀏覽器永久記憶體。


然後,.htaccess相應子目錄中的每個文件應採用以下形式:

RewriteEngine On
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . index.php [L]

無需在替換中指定RewriteBase包含子目錄。RewriteRule

引用自:https://serverfault.com/questions/956060