2011-11-29 38 views
2

我試圖以這種方式設置我的開發,分段和生產服務器,以便可以創建單個.htaccess文件並使用特定於環境的變量來確定要執行哪些重寫操作。我想使用特定服務器的名稱來進行URL重寫,但我似乎遇到了一些我根本無法解決的問題(可能是微不足道的)。使用.htaccess重寫特定於服務器的URL的方法不服從RewriteCond

這個.htaccess文件的目標是:

  • 重寫URL到WWW生產服務器上只
  • 發送.html文件名作爲foo查詢瓦爾
  • 發送.htm文件名作爲bar查詢瓦爾
  • 能夠修改或添加額外的規則到特定的服務器

this suggested outline類似,我htaccess文件是這樣的:

Options +FollowSymlinks 
RewriteEngine On 

# Production 

# Redirect to WWW on production server 
RewriteCond %{SERVER_NAME} =www.domain.com [NC] 
RewriteCond %{HTTP_HOST} !^www\.domain.com 
RewriteRule ^(.*)$ http://www.%{HTTP_HOST}/$1 [L,R=301,NC] 

RewriteCond %{SERVER_NAME} www.domain.com [NC] 
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteRule ^(.+)\.html index.php?foo=$1 [NC,L,QSA] 
RewriteRule ^(.+)\.htm index.php?bar=$1 [NC,L,QSA] 

# Staging 
#RewriteCond %{SERVER_NAME} =staging.domain.com [NC] 
#RewriteCond %{REQUEST_FILENAME} !-f 
#RewriteCond %{REQUEST_FILENAME} !-d 
#RewriteRule ^(.+)\.html index.php?foo=$1 [NC,L,QSA] 
#RewriteRule ^(.+)\.htm index.php?bar=$1 [NC,L,QSA] 

# Development 
RewriteCond %{SERVER_NAME} =localhost [NC] 
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteRule ^(.+)\.html index.php?foo=$1 [NC,QSA,L] 
RewriteRule ^(.+)\.htm index.php?bar=$1 [NC,QSA,L] 

說我遇到的問題是,無論何種順序我列出的服務器在.htaccess文件中,只列出的第一個服務器似乎重寫正確。在部署在其他服務器上時,我注意到foo測試用例被跳過,而是作爲bar結果返回。我已經能夠確定這似乎來自第一個服務器部分中的第二個RewriteRule,但我無法弄清楚原因。

更多信息可應要求提供。

回答

3

我想也許你需要用HTTP_HOST替換SERVER_NAME檢查,並在你的html/htm檢查中添加一個$

# Redirect to WWW on production server 
RewriteCond %{HTTP_HOST} ^domain\.com$ [NC] 
RewriteRule ^(.*)$ http://www.domain.com/$1 [L,R=301,NC] 

RewriteCond %{HTTP_HOST} ^www\.domain\.com$ [NC] 
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteRule ^(.+)\.html$ index.php?foo=$1 [NC,L,QSA] 
RewriteRule ^(.+)\.htm$ index.php?bar=$1 [NC,L,QSA] 

# Staging 
#RewriteCond %{HTTP_HOST} ^staging\.domain\.com$ [NC] 
# otherwise, it would look same as Development 

# Development 
RewriteCond %{HTTP_HOST} ^localhost$ [NC] 
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteRule ^(.+)\.html$ index.php?foo=$1 [NC,QSA,L] 
RewriteRule ^(.+)\.htm$ index.php?bar=$1 [NC,QSA,L] 
+0

在html/htm檢查中對'$'有很大的影響。像我之前提到的那樣,我可以保留'%{SERVER_NAME}'而不是'%{HTTP_HOST}'。任何我不應該使用它的原因,而應該遵循你的建議呢? – ServAce85

+1

如果它適合你,可能沒有令人信服的理由讓你需要將它們改爲'HTTP_HOST'。但是因爲'SERVER_NAME'是一個服務器內部的[從UseCanonicalName指令取得它的值](http://httpd.apache.org/docs/2.2/mod/core.html#usecanonicalname),而不是'HTTP_HOST',它是一個瀏覽器提供的請求標題,它基於它認爲應該與之交談的域,有時它們根據某人的特定服務器配置不可互換。 –

+0

欣賞澄清。 – ServAce85