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
,但我無法弄清楚原因。
更多信息可應要求提供。
在html/htm檢查中對'$'有很大的影響。像我之前提到的那樣,我可以保留'%{SERVER_NAME}'而不是'%{HTTP_HOST}'。任何我不應該使用它的原因,而應該遵循你的建議呢? – ServAce85
如果它適合你,可能沒有令人信服的理由讓你需要將它們改爲'HTTP_HOST'。但是因爲'SERVER_NAME'是一個服務器內部的[從UseCanonicalName指令取得它的值](http://httpd.apache.org/docs/2.2/mod/core.html#usecanonicalname),而不是'HTTP_HOST',它是一個瀏覽器提供的請求標題,它基於它認爲應該與之交談的域,有時它們根據某人的特定服務器配置不可互換。 –
欣賞澄清。 – ServAce85