2013-04-20 44 views
0

我與Lighty的mod_rewrite模塊有問題。Lighttpd的mod_rewrite模塊

我試圖做這個:example.com/index.php?search=whatever,出現example.com/whatever或example.com/search/whatever(還沒有決定 - 不知道多少關於搜索引擎優化)

雖然我希望它像上面那樣行事,但我也想排除所有的physichal目錄和所有文件,例如目錄/ images /和文件index.php,favicon.ico,style.css等從重寫,因爲它的行爲很奇怪。

我該怎麼做到這一點?我試過以下,它的工作好了我想要的東西,但並沒有真正與目錄和文件的工作,排除:

url.rewrite-once = (
"^/([a-zA-Z0-9_-]+)" => "/index.php?search=$1", 
"^/(images|js|wp-content)/(.*)" => "$0", 
"(.*\.php|.*\.css|favicon.ico)" => "$0") 

順便說一句,有什麼區別有此之間:

"^/([a-zA-Z0-9_-]+)" => "/index.php?search=$1", 

這:

"^/(.*)$" => "/index.php?search=$1" 

回答

1

爲了避免必須添加大量的RewriteCond指令檢查訪問者的請求不是一個實際的文件,而不是人爲的路徑,我建議去機智h /search/whatever模式有利於/whatever模式。然後,只要你從不創建一個名爲「search」的實際目錄,你永遠不需要檢查以/search開頭的路徑是否是實際的文件路徑。所以,你的重寫規則變成這個簡單:

RewriteRule ^/search/([a-zA-Z0-9_-]+)$ /index.php?search=$1 

(我不熟悉萊蒂,所以我不知道如何翻譯成url.rewrite一次指令這一問題,但是就是這樣一個簡單的重寫它應該是直截了當的。)

但是,訪問者的瀏覽器現在會認爲他們正在查看一個名爲「search」的子目錄中的頁面,因此如果您有任何圖像元素或CSS文件指定了相對路徑(路徑沒有固定到根目錄),如src="images/photo.jpg"href="stylesheets/clean.css",那麼瀏覽器會認爲這些路徑是相對於「搜索」目錄,並會詢問您的Web服務器的分別爲和/search/stylesheets/clean.css

有兩種方法可以做到這一點。首先是將所有頁面裝飾(圖像,樣式表,JavaScript)路徑更改爲絕對路徑。也就是說,改變路徑,以便以代表網站根目錄的正斜線開始。因此,您的圖片路徑需要更改爲src="/images/photo.jpg",您的樣式表路徑需要更改爲href="/stylesheets/clean.css"。開始處的正斜槓告訴網絡瀏覽器該路徑從該站點的根目錄開始,因此不存在歧義。

第二種選擇是創建複雜的RewriteRules,將圖像,樣式表,腳本文件等的請求重定向到正確的目錄。如果你在很多不同的目錄中有很多媒體類型,並且你需要它們從很多不同的子目錄(虛擬和/或其他)中工作,這往往會變得醜陋和脆弱。

您選擇哪個選項取決於您的要求和偏好。

關於您對[a-zA-Z0-9_-]+.*之間差異的問題,第一種模式只允許字母a到z(小寫或大寫),數字,下劃線和連字符。第二種模式允許任何字符。出於安全性和調試的原因,通常使用限制字符的模式只適用於那些應該允許的模式。所以我會選擇這些模式中的第一個,如果需要添加額外的允許字符,而不是允許所有字符。

+0

好的,幫了很多!但是現在我發現了另一個問題。每當我用特殊字母搜索時,例如ö,ü,ï等等,它都不會起作用。我已經嘗試爲這樣的所有字母添加\ p {L}: 「^/search /([0-9 \ p {L} _-] +)」=>「/index.php?search= $ 1「 但這根本沒有幫助。順便說一句,每當我搜索名稱如「john example」時,它只搜索空間之前的任何內容。我試圖用「john + example」,「john_example」和「john-example」來解決這個問題,但這些都沒有。我在我的RewriteRule中丟失了什麼? – AnonymousJ 2013-04-21 14:05:12

+0

雖然當我允許通過'。*'模式的所有字符,一切似乎工作正常。 – AnonymousJ 2013-04-21 14:29:24

+0

我對'\ p {L}'語法不熟悉,但是正則表達式確實提供了'\ w'單詞字符類(它匹配字母,數字和非必要項)。所以你可以試試'([\ w + - ] +)'來允許單詞字符,加號和連字符。您也可以在字符類中輸入一個空格(但要確保文字連字符是方括號中的最後一個字符),但空格不會在原始URL中被允許,所以我不知道空格是否會比賽。 – Bobulous 2013-04-21 16:50:24