2012-01-26 40 views
0

我的一個.htaccess重寫代碼有問題: 服務器詳細信息: 服務器運行LiteSpeed Web服務器不是Apache,根據我的主機提供商,它與apache mod_rewrite完全兼容。
問題: 我得到500內部服務器錯誤,當我使用此代碼:.htaccess 500錯誤。 RewriteRule不能正常工作

<IfModule mod_rewrite.c> 
    Options +FollowSymLinks 
    Options +Indexes 
    RewriteEngine On 
    RewriteBase/
    RewriteCond %{HTTP_HOST} !^www\.mysite\.com$ [NC] 
    RewriteCond %{HTTP_HOST} ^(www.)?([a-z0-9-]+).mysite.com$ [NC] 
    RewriteRule ^(.*)$ %2/$1 [L,QSA,NC] 
</IfModule> 

當我使用此代碼,它幾乎做什麼它是假設這樣做將流量重定向從任何子域名轉讓給對應的子文件夾也有文件請求。沒有錯誤,沒有什麼它可以正常工作,但它也改變了我不希望的瀏覽器地址。

<IfModule mod_rewrite.c> 
    Options +FollowSymLinks 
    Options +Indexes 
    RewriteEngine On 
    RewriteBase/
    RewriteCond %{HTTP_HOST} !^www\.mysite\.com$ [NC] 
    RewriteCond %{HTTP_HOST} ^(www.)?([a-z0-9-]+).mysite.com$ [NC] 
    RewriteRule ^(.*)$ http://mysite.com/%2/$1 [L,QSA,NC] 
</IfModule> 

任何想法?

Editetd:我想提到的一件事是,我使用通配符DNS子域不會真正存在。 再次編輯:RewriteRule ^(。*)$%2/index.php [L,QSA,NC]如果我使用這個規則,並嘗試訪問http://sub.mysite.com/whatever它succesfuly重定向到http://mysite.com/sub/index.php我不明白爲什麼它當我改變它們時,我不能使用$ 1而不是index.php,我得到500內部服務器錯誤。

現在得到了解決:

<IfModule mod_rewrite.c> 
Options +FollowSymLinks 
Options +Indexes 
RewriteEngine On 
RewriteBase/
RewriteCond %{ENV:REDIRECT_STATUS} !200 
RewriteCond %{HTTP_HOST} ^(.*)mysite\.com$ [NC] 
RewriteCond %{HTTP_HOST} !^www\.* [NC] 
RewriteRule ^(.*)$ http://www.%1mysite.com/$1 [R=301,L,QSA] [NC] 
RewriteCond %{HTTP_HOST}  !^www\.mysite\.com$    [NC] 
RewriteCond %{HTTP_HOST}  ^(www.)?([a-z0-9-]+).mysite.com$ [NC] 
RewriteCond %2==$1   !^(.*)==\1           
RewriteRule ^(.*) %2/$1$2$3 [L,QSA,NC] 
</IfModule> 
+0

500錯誤檢查錯誤日誌 - 他們會告訴你一切。 – Cheery

回答

0

這是一個有趣的普遍問題,其案情通用的解決方案,因此,如何:服務器的

# 
# Rule matches ('fred','','') for pattern 'fred' 
#    ('123','/',fred') for pattern '123/fred' 
# At cond 2 %2 is the subdomain e.g. 123 for www.123.mysite.com 
# Hence cond 3 pattern is 123==123 for www.123.mysite.com/123/fred 
# and this will match ^(.*?)==\1 or fail its negation 
# 
RewriteCond %{HTTP_HOST}  !^www\.mysite\.com$    [NC] 
RewriteCond %{HTTP_HOST}  ^(www.)?([a-z0-9-]+).mysite.com$ [NC] 
RewriteCond %2==$1   !^(.*?)==\1           
RewriteRule ^([^/]*)(/?)(.*) %1/$1$2$3      [L] 
+0

它現在工作正常重定向,但現在我有一個愚蠢的事情發生:) – George87

+0

當我嘗試訪問index.php在測試子域它重定向到domain.com/test/index.php這就是我所希望的。問題是,爲了測試,我使用了一個類似於domain.com中的index.php,只是我沒有在測試子文件夾中放置domain.com索引的圖像和style.css,但是當我訪問測試時。 domain.com第一次使用來自domain.com的style.css,當我按刷新時,我不再使用它,它只是顯示文本沒有正常的CSS。你能告訴我爲什麼第一次使用domain.com的風格嗎? – George87

+0

我設法通過用www重寫所有流量來解決此問題。現在工作正常。非常感謝。 – George87

0

這是因爲它要創建一個無限循環重寫。 123.mysite.com/得到改寫爲123.mysite.com/123/,這被改寫爲123.mysite.com/123/123/

嘗試以此來防止這種循環:

RewriteCond %{ENV:REDIRECT_STATUS} !200 
RewriteCond %{HTTP_HOST} !^www\.mysite\.com$ [NC] 
RewriteCond %{HTTP_HOST} ^(www.)?([a-z0-9-]+).mysite.com$ [NC] 
RewriteRule ^(.*)$ %2/$1 [L,QSA,NC] 
+0

我只是不認爲這是這種情況下,它的工作原理,如果我使用http://mysite.com/%2/$1的代碼實際上它可以完美的工作,但正如我張貼在我的問題,它重定向到web瀏覽器http ://mysite.com/subdomain_folder/whatever ...我只想指向mysite.com/subdomain_folder/whatever,並在網頁瀏覽器中,地址欄應該指明http://subdomain.mysite.com/whatever ...在其實我認爲問題在於服務器如何解釋$ 1變量 – George87

+0

對不起,我從你的問題中複製了錯誤的代碼。我編輯它,它現在應該工作。 – Gerben

+0

發生同樣的事情500錯誤 – George87

0

我覺得你的規則應該被改寫這樣的:

Options +FollowSymLinks -MultiViews 
RewriteEngine on 

RewriteCond %{HTTP_HOST} !^(www\.)?mysite\.com$ [NC] 
RewriteCond %{HTTP_HOST} ^(www\.)?([a-z0-9-]+)\.mysite\.com$ [NC] 
RewriteRule^http://mysite.com/%2%{REQUEST_URI} [L,P] 

P標誌將使其行爲像一個代理,並將保持在瀏覽器中的網址爲subdomain.mysite.com/whatever而不是mysite.com/subdomain/whatever

+0

Anubhava,我對你使用[proxy]標誌很感興趣。當然,這依賴於加載的mod_proxy,並且需要適當的'ProxyPassReverse'指令來支持。由於可能的開發問題,大多數主機提供商和LAMP堆棧禁用mod_proxy。 – TerryE

+0

@TerryE:OP想要一個重定向,其中域名正在改變,但OP仍然不需要外部重定向,也不想更改瀏覽器的URL。因爲'R'肯定會改變瀏覽器中的URL,因此IMO'P'是唯一可能的方式。但是我不確定'OP'是否可用於OP。 – anubhava

+0

無法正常工作,但無論如何,順便說一句,我使用通配符dns作爲子域名,我們在這裏討論的.htaccess文件位於主域的根目錄中。 – George87