2012-03-20 77 views
0

我到處看看網上的教程htaccess的都是非常基本的。他們沒有解釋什麼從哪裏獲得advenaced htaccess的turorials

RewriteCond %{HTTP_HOST} ^www\.mysite\.com$ [NC] 
RewriteRule ^(.*)$ http://mysite.com/$1 [R=301,L] 

[NC][R=301,L]平均(我可以計算的301 REDIR壽)

而且哪裏的%{HTTP_HOST}令牌進來嗎?還有其他什麼?什麼時候捕獲了$1? ...

是否有解釋這一切的任何教程?

編輯:下面是我的mguymon htaccess文件:

Options -Indexes 
ErrorDocument 404 /404.php 
CheckSpelling on 

RewriteEngine On 
RewriteBase/ 
###### Check for alias module to be installed ###### 

###### Domain without www ###### 
RewriteCond %{HTTP_HOST} ^www\.mysite\.com$ [NC] 
RewriteRule ^(.*)$ http://mysite.com/$1 [R=301,L] 

###### End www rewrite section ###### 

# Remove multiple slashes anywhere in URL 
RewriteCond %{REQUEST_URI} ^(.*)//(.*)$ 
RewriteRule . %1/%2 [R=301,L] 

# Remove multiple slashes after domain 
RewriteCond %{HTTP_HOST} !="" 
RewriteCond %{THE_REQUEST} ^[A-Z]+\s//+(.*)\sHTTP/[0-9.]+$ 
RewriteRule .* http://%{HTTP_HOST}/%1 [R=301,L] 

RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteRule ^(.*)$ /index.php?$1 [L] 

# show mysite.com/index.php always as mysite.com/ 
RewriteCond %{THE_REQUEST} ^[A-Z]{3,9}\ /index\.php\ HTTP/ 
RewriteRule ^index\.php$ http://mysite.com/ [R=301,L] 

這將改變www.mysite.com/index.php/////index.phpmysite.com這是每一個與他們[L]開關

+0

教程不是參考。 http://httpd.apache.org/docs/2.2/mod/mod_rewrite.html – 2012-03-20 01:24:07

回答

1

Apache .htaccess文件使用標準的Apache配置,例如Mod RewriteMod Rewrite文檔解釋了RewriteCond和RewriteRule的運行方式。

我會打破你的ModRewrite問題:

RewriteCond %{HTTP_HOST} ^www\.mysite\.com$ [NC] 
  • RewriteCond是一個條件,以確定是否重寫應該發生。
  • %{HTTP_HOST}指的RewriteCond正在檢查請求
  • ^www\.mysite\.com$的主機名的圖案,如果主機名匹配www.mysite.com
  • [NC]檢查意味着無的情況下,使圖案匹配的情況下不敏感的

例如,如果有人請求http://www.mysite.com/index.html,則RewriteCond將檢查主機www.mysite。com針對^www\.mysite\.com$的模式,並且由於它匹配,將執行以下RewriteRule。

RewriteRule ^(.*)$ http://mysite.com/$1 [R=301,L] 
  • RewriteRule爲電動工具改寫請求
  • ^(.*)$是模式,這將匹配一切。如果模式不匹配,則RewriteRule將不會執行。
  • http://mysite.com/$1是重寫,基本上將請求從www. mysite.com更改爲mysite.com。
  • [R=301,L]表示重寫應發送301重定向,併成爲最後一次重寫規則運行。

持續的http://www.mysite.com/index.html的例子中,其經過的RewriteCond,/index.html將匹配^(.*)$圖案,重寫將被設置爲http://mysite.com/index.html和發送作爲301重定向並沒有進一步RewriteRules會發生。


編輯:思考的配置

從我的經驗,你希望所有的重定向在你的配置的頂部。特別是在你的事業中,如果你正在試圖規範你的網址,那麼請求將通過一系列重定向來清除。一旦完成,您將重寫以提供正確的內容。考慮到這一點,這裏是最後2條規則微調的配置:

# show mysite.com/index.php always as mysite.com/ 
    RewriteCond %{THE_REQUEST} ^[A-Z]{3,9}\ /index\.php\ HTTP/ 
    RewriteRule ^index\.php$ http://mysite.com/ [R=301,QSA,L] 

    RewriteCond %{REQUEST_FILENAME} !-f 
    RewriteCond %{REQUEST_FILENAME} !-d 
    RewriteRule ^/(.*)$ /index.php?a_param=$1 [QSA] 

關閉我的頭頂,我無法驗證RewriteCond %{THE_REQUEST},但它看起來不錯。我懷疑你想[QSA]標誌是查詢字符串追加。這將導致http://mysite.com/index.php?user=blah重定向到http://mysite.com/?user=blah。如果您需要使用重定向傳遞查詢字符串,則需要將QSA添加到其他重定向。

最後一條規則是確定是否應該使用index.php而不是htaccess(目錄,圖像,js等)目錄中的靜態內容。你不希望這是重定向,而是重寫。不要使用[R]或[L],但要再次添加[QSA]。匹配的模式應該設置爲傳遞給index.php的特定參數。

這與以前的規則組合會導致http://mysite.com/index.php?user=blah重定向到到http://mysite.com/?user=blah然後是重寫,因此index.php用於http://mysite.com/?a_page=&user=blah。請求http://mysite.com/a_page?id=7將被重寫,因此index.php用於http://mysite.com/?a_param=a_page&user=blah

+0

我見過很多帶有多個重寫規則的htaccess文件,它們都具有'[L]'在第一個不能運行後沒有任何意義。 – qwertymk 2012-03-20 12:11:32

+0

正確,這意味着只有1個RewriteRule會運行。通常這是爲了防止規則重疊。 RewriteRule模式將確定是否運行規則,因此根據請求,第一個RewriteRule不會每次都運行。 – mguymon 2012-03-20 12:25:56

+0

我的htaccess一次應用超過1條規則,他們都有'[L]'開關。 – qwertymk 2012-03-20 12:32:57

1

退房的Apache documentation三個規則。它解釋了括號內[]中所有選項的含義。

  • [NC]沒有情況下的(或不區分大小寫)
  • [R=301]是301(永久)重定向
  • [L]意味着最後一個規則或停止重寫

%{HTTP_HOST}是代表一個server or environment variable主機的基本URL,例如www.example.com

如果你瞭解正則表達式,你也應該明白,分組開始^之間(.*)匹配所有字符,並結束路徑(整個路徑),然後你就可以在第二部分用作爲$1$

+0

查看我的編輯,'[L]'標誌不會阻止它應用更多的規則。 – qwertymk 2012-03-20 12:50:16