2010-11-17 125 views
2

好吧,現在我迷路了。.htaccess子域名重定向不起作用

我試圖做的子域的一個簡單的.htaccess重定向到服務器上的特定文件夾,這意味着所有

subdomain.mywebsite.com 

會去

www.mywebsite.com/s_subdomain 

但由於種種原因這並未」工作。

我已經嘗試了很多的.htaccess的設置,但沒有好處。現在我的.htaccess中有:

RewriteEngine on 

Options +FollowSymLinks 
Options +SymlinksIfOwnerMatch 

RewriteCond %{HTTP_HOST} !^(www|ftp|mail)\.mywebsite\.com 
RewriteCond %{HTTP_HOST} ^([^.]+)\.mywebsite\.com 
RewriteRule (.*) /s_%1/$1 [L] 

是否有其他設置,或者somethig我錯過了?

PS。 - 我無法訪問http.conf。我必須只使用.htaccess

謝謝!

+0

忽略重定向還是會得到某種錯誤信息? – 2010-11-27 23:47:26

+0

@nhnb:我收到'Page Not found'消息。我正在嘗試訪問test.mywebsite.com。我在public_html上創建了文件夾s_test,並在那裏添加了一個index.html文件。所以,如果我鍵入http://www.mywebsite.com/s_test它正在工作。 – CristiC 2010-11-28 12:26:51

+0

你確定去'anysubdomain.mywebsite.com'的請求正在被你的'.htaccess'文件處理嗎? – 2010-11-30 10:18:19

回答

3

這只是一個「普通」重寫(瀏覽器不會看到它)。要重定向,請將R標誌添加到您的RewriteRule中。

RewriteRule (.*) /s_%1/$1 [L,R] 

其餘的似乎是正確的,雖然我沒有測試它。對於調試,你可以考慮RewriteLog,請參閱http://httpd.apache.org/docs/2.0/mod/mod_rewrite.html#rewritelog

+0

它仍然無法正常工作。 RewriteLog無法使用,因爲我無法訪問服務器配置。也許有其他設置可以在.htaccess中應用,或者可能是http.conf中的服務器配置,它禁止我這樣做。 – CristiC 2010-11-17 10:29:51

+0

是的,您的服務器管理員可能已禁用mod_rewrite。您可以通過一個簡單的.htaccess來確認:RewriteEngine on,RewriteRule(。*)http://stackoverflow.com/ [R]應該重定向所有請求。 – 2010-11-17 10:33:06

+0

我推出了這個規則,它工作正常。它正在重新定向我。所以這意味着mod_rewrite被啓用。 – CristiC 2010-11-17 10:48:23

0

RewriteRules是一個婊子。

下面應該工作:

的.htaccess

RewriteCond ${SERVER_NAME} !^(www|ftp|mail)\.example\.com$ 
RewriteCond ${SERVER_NAME} !^([^.]+)\.example\.com$ 
RewriteRule .* redirect.php?to=%1 

redirect.php

<?php 
    $desired_server_name = 'http://example.com'; 
    $subdir = 's_' . $_GET['to']; 

    $url = $desired_server_name . '/' . $to . $_SERVER['REQUEST_URI']; 

// Permanent redirects 
    header('HTTP/1.1 301 Moved Permanently'); 

// Or simple redirects: 
    header('HTTP/1.1 302 Found'); 

    header('Location: '.$url); 
?> 

作品在我的服務器上(Debian的4 /阿帕奇2)。

加成:不要使用HTTP_HOST!請參閱以下要求:

HTTP/1.1 GET /foo/bar.php 
Host: www.host.tld"><script>alert(/Hello/)</script 
Connection: close 

如果你用你的.PHP腳本$_SERVER['HTTP_HOST']構建爲此事鏈接或的.htaccess規則和「www.host.tld」是配置的虛擬主機或主機只Apache中,HTTP請求頭中的XSS將被非轉義傳遞。

0

我們在我們的虛擬機上也有類似的事情,我們將anything.usertld重定向到該域的一個文件夾,該文件夾位於httpd.conf中,在.htaccess中嘗試過,並且像您的那樣無法工作。

調整它,這對我的作品(我的虛擬機佔用了一個名爲BENB TLD,但將其更改爲您的域名應該是罰款):

RewriteCond %{HTTP_HOST} !^www\.benb 
    RewriteCond %{HTTP_HOST} ^(.*)\.benb 
    RewriteCond %{REQUEST_URI} !^/{0,1}s_ 
    RewriteRule ^(.*)$ s_%1/$1 [L] 

而且這部分計算域之前的所有文字..你應該能夠改變:

RewriteCond %{HTTP_HOST} ^(.*)\.benb 

RewriteCond %{HTTP_HOST} ^([^.]+)\.benb 

處理只是1級子域名。另外你的其他部分(www | ftp | mail)也可以正常工作。

1

那麼,這兩種解決方案都不起作用?嘗試一些簡單的事情。

RewriteEngine on 

RewriteCond ${SERVER_NAME} ^(subdomain)\.yoursite\.com$ [nc] 
RewriteRule ^(.*)$ http://www.yoursite.com/s_%1/$1 [L,R] 

要測試你的子域是正確處理,創建random.html文件,將其放置在它應該被讀取,並嘗試通過http://subdomain.yoursite.com/random.html打開它。然後,你可以嘗試一些東西,如:

RewriteRule ^random.html - [F] 

...如果阻止訪問文件,請嘗試在前面加上

RewriteCond ${SERVER_NAME} ^subdomain\.yoursite\.com$ [nc] 

以前的規則,以阻止訪問該文件,以確保重寫引擎實際上觸及你的規則。這將只針對所需的子域(www.yoursite.com/random.html應該工作,但通過子域訪問不應該)。

然後,如果這些規則的工作,這只是添加更多的東西,看看它什麼時候停止工作的問題。