Apache-2.2

.htaccess 萬用字元子域路徑

  • March 30, 2017

我的網站設置如下:

RewriteCond %{HTTP_HOST} !^www\.example\.com
RewriteCond %{HTTP_HOST} ([^.]+)\.example\.com [NC]
RewriteRule ^/?$ /user/profile.php?name=%1 [L]

這樣做是如果使用者訪問: test.example.com,它將顯示文件內容: example.com/user/profile.php?name=test。如果有人去lol.example.com,它將顯示 page:example.com/user/profile.php?name=lol但 URL 將與子域保持相同,例如test.example.comlol.example.com

那部分正在工作。


問題:

如果我轉到test.example.com/login,它將顯示我的域根文件。我怎樣才能讓它顯示/user文件夾中的東西?

例如:

  • test.example.com/login將顯示example.com/user/login並將test.example.com/register顯示example.com/user/register,但 URL 將與子域保持相同?
  • test.example.com/pathtofile應該得到example.com/user/pathtofile. “pathtofile”應該是動態的。我只想查看文件夾的路徑/user,而不是根文件夾。

如果有人去lol.example.com,它將顯示 page: example.com/user/profile.php?name=lol

嚴格來說,它會顯示頁面:(lol.example.com/user/profile.php?name=lol子域沒有被刪除)。但是由於(我假設)所有子域和主域都指向文件系統上的同一個位置,所以它可以工作。

test.example.com/pathtofile應該得到的內容example.com/user/pathtofile

test.example.com/您的原始指令僅重寫對文件根 ( )的請求。要重寫/pathtofile,您可以在.htaccess. 例如:

RewriteCond %{HTTP_HOST} !^www\.example\.com
RewriteCond %{HTTP_HOST} [^.]+\.example\.com [NC]
RewriteCond %{REQUEST_URI} ^/([^/]+)$
RewriteRule !^user/ /user/%1 [L]

這將重寫所有尚未開始/user/且僅包含單個(非零長度)路徑段的請求,如您的範例(例如,/pathtofile而不是/path/to/file),並重寫為/user/pathtofile.

**更新:**如果你有一個ErrorDocument定義,那麼你需要在你的 .htaccess 文件中更早地創建一個異常,以防止錯誤文件的子請求被重寫。例如:

RewriteRule ^404\.php$ - [L]

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