2013-08-30 50 views
0

我一直在搞亂.htaccess超過一年,並且仍然不知道如何自己創建規則,我總是看這裏或谷歌,或者在這裏問。如何找到.htaccess RewriteRule的很好的描述?

所以這次我想要一個「教我如何釣魚」的要求。我怎樣才能真正學會如何編寫一個簡單的RewriteRule

例如,更改URL mysite.com/index.php?lang=enmysite.com/en

我想讀書the documentation,但坦率地講它並沒有給任何的想法給我。

你知道一個很好的網站,解釋這樣的規則,尤其是那些將$_GET變量轉換爲url文件夾路徑的網站嗎?

如果沒有,我可以把我的時間,並在這裏創建一個。

但首先我要學習:)

謝謝!

+0

我認爲文檔是你永遠需要誠實的。 –

+0

您粘貼的文檔鏈接非常棒。接下來的事情是啓用[RewriteLog](http://httpd.apache.org/docs/current/mod/mod_rewrite.html#logging),這樣你就可以看到你的錯誤。最後,你需要熟悉正則表達式。 –

+0

您鏈接了一條單獨的指令,可以很好地閱讀關於指令(設置)的所有技術規範。詳細的文檔在這裏(和有圖片):http://httpd.apache.org/docs/current/rewrite/ – hakre

回答

1

我個人很喜歡the rewrite rule intro什麼,這是非常好做,並有圖像描述與重寫會發生什麼哪非常方便。

正如hakre在評論中所說的,httpd aka apache使用PCRE,它幾乎是perl使用的,並且php preg_*

有許多方法可以存檔您想要的東西。

mysite.com/index.php?lang=en 

mysite.com/en 

第一種是通過創建一個內部重定向和變更鏈接到它,這是最簡單和常用的方法。

此方法允許您訪問mysite.com/en,同時爲您提供內部重定向mysite.com/index.php?lang=en的內容。

但是,它不會阻止您訪問舊網址或重定向該網址。

下面是一個例子:

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

另一種方法是將其他的URL與內部重寫它一起重定向。

所以,如果你訪問:

mysite.com/index.php?lang=en 

它會帶你到:

mysite.com/en 

同時給你的mysite.com/index.php?lang=en內容。

下面是一個例子:

# External redirect 
RewriteCond %{THE_REQUEST} ^[A-Z]{3,}\s/+index\.php\?lang=([^\s&]+) [NC] 
RewriteRule^/%1? [R=301,L] 

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

從這些規則排除存在的文件,你可以使用這些條件:

RewriteCond %{REQUEST_FILENAME} !-d 
RewriteCond %{REQUEST_FILENAME} !-f 

上述2個條件告訴它只能重定向如果文件和文件夾不存在。

+0

非常感謝您的回答,Prix! 我用你的第一個例子,它的工作原理,但也有其他問題。例如我的頁面從mysite.com/css/styles.css加載css文件,但是使用這個規則,它也將mysite.com/css轉換爲mysite.com/index.php?lang=css,那麼我怎樣才能約束lang變量是2個字符,還是「en」或「tr」之一?文檔在哪裏講述這個問題? 謝謝! – jeff

+1

@CengizFrostclaw查看更新,並查看答案的底部以查看它的作用。至於如何製作正則表達式,你可以使用這個網站作爲例子:http://perldoc.perl.org/perlre.html – Prix

0

你真的需要開始大量的例子。一旦你覺得你有一個類似的例子,你想你可以使用這個htaccess的規則測試儀測試規則http://htaccess.madewithlove.be/

+0

該網站很漂亮,我幾乎不會稱它爲一個很好的參考。雖然有些真正非常基本的東西在那裏工作,但最好的方法是在真實的服務器上嘗試,即使只是測試的子文件夾。 – Prix