2016-04-08 84 views
7

我希望能夠給所有子域名重定向到一個文件夾:htaccess的重定向所有子域到同一個目錄

RewriteCond %{HTTP_HOST} ^([^/.]+)\.example\.com$ 
RewriteRule (.+)$ "http://example.com/subdomains/%1" [L,P] 

例如,如果一些訪問sub1.example.com它將保持URL,但顯示example.com/subdomains/sub1如果SUB1目錄不存在,它會顯示example.com/404

這可能嗎?

我試過上面的代碼,但它給我看:

Forbidden 
You don't have permission to access /index.php on this server. 

的WordPress說:

# BEGIN WordPress 
<IfModule mod_rewrite.c> 
RewriteEngine On 
RewriteBase/
RewriteRule ^index\.php$ - [L] 
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteRule . /index.php [L] 
</IfModule> 

# END WordPress 

,並在我的htaccess文件的頂部,是:

RewriteEngine On 
DirectoryIndex index.php 

RewriteCond %{HTTP_HOST} admin.domain.com$ 
RewriteRule ^(.*)$ /admin/system/$1 [L] 
+0

如果你直接去'http:// example.com/subdomains/sub1 /'怎麼辦?你是否也有'Forbidden'錯誤或者你有權訪問它?無論如何,儘管事實並非如此,你的代碼仍然可以工作。而且我認爲它實際上工作。當你有這個'禁止',你看到'sub1.example.com'爲url? –

+0

沒有錯,沒有錯誤 – charlie

+0

代碼對我來說也很好。禁止的問題可能由其他.htaccess設置引起,例如在IndexIgnore上。檢查你的位置。 –

回答

10

當您使用完整的URL作爲目標時,上面的.htaccess會在外部重定向調用。

在你的問題中,你說你想保留主機名,所以我會認爲這是要求。

0)使能重寫引擎

RewriteEngine On 

1)重寫已知的子域,以他們的目錄中/子域

# Rewrite known subdomains to /subdomains/{subdomain}/ 
RewriteCond %{HTTP_HOST} ^([^/.]+)\.example\.com$ 
RewriteCond %{REQUEST_URI} !^/subdomains [NC] 
RewriteCond %{REQUEST_URI} !^/404 [NC] 
RewriteRule ^(.+)$ /subdomains/%1/ [L] 
  1. 當我們遇到一個子域的請求,
  2. 和我們沒有將其重寫到/子域名
  3. 並且我們還沒有將其重寫到/ 404
  4. 然後重寫/子域/ {子域}/

所以,如果請求

http://foo.example.com/hello 

在瀏覽器的URL將保持不變,但在內部被映射到

/subdomains/foo/ 

2)重寫未知子域/ 404

# Rewrite missing unknown subdomains to /404/ 
RewriteCond %{HTTP_HOST} ^([^/.]+)\.example\.com$ 
RewriteCond %{REQUEST_URI} ^/subdomains [NC] 
RewriteCond %{REQUEST_URI} !^/404 [NC] 
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteCond %{REQUEST_FILENAME} !-l 
RewriteRule ^(.+)$ /404/ [L] 
  1. 當我們遇到一個子域的請求,
  2. ,我們已將其改寫成/子域
  3. ,我們還沒有它改寫爲/ 404
  4. ,它是不存在的文件
  5. 並且沒有現有作爲目錄
  6. 並且它不存在作爲一個符號鏈接
  7. 然後將其重寫到/ 404

所以,如果請求

http://bar.example.com/hello 

在瀏覽器的URL將保持不變,但在內部由1第一RewriteRule被映射到

/subdomains/bar/ 

)。

如果/subdomains/bar/不存在,從2秒RewriteRule)將踢並在內部將其映射到

/404/ 

3)測試環境

我實際上與示例性代碼測試的所有的這一點,這裏可用:https://github.com/janpapenbrock/stackoverflow-36497197

+0

我也有WordPress的安裝 - 我把這兩部分代碼的上面或下面的WordPress代碼? – charlie

+0

你使用WordPress的這些子域名或只是主域名?如果只是主要的,我會嘗試把它放在上面。 –

+0

它只是主域名 - wordpress只在主域名上運行。香港專業教育學院試圖把它放在上面,它的工作原理,但停止工作的主要領域(WordPress的),如果我把它放在下面,WordPress的作品,但沒有子域做 – charlie

3

我假設您遇到許可問題。我猜你的Apache服務器運行爲apache用戶。使用chmod可以給apache訪問此路徑。

相關問題