2014-11-06 94 views
1

我想重寫一些URL,但我的新手正在阻礙。htaccess URL重寫有和沒有查詢字符串

網址輸入到地址欄

example.com/prefix-suffix.html 
example.com/prefix-suffix.html?v=huzzah 

所需的輸出(希望他們顯示等)

example.com/prefix/suffix/ 
example.com/prefix/suffix/huzzah 

我看了一些其他的例子like this one,但我只是不瞭解他們正在做什麼或如何做,這使得修改具有挑戰性。

如果你有時間來解釋每一行正在做什麼,我會大大欣賞它。

謝謝。

回答

1

您可以在DOCUMENT_ROOT/.htaccess文件中使用此代碼:

RewriteEngine On 
RewriteBase/

RewriteCond %{THE_REQUEST} \s/+([^-]+)-([^.]+)\.html\s [NC] 
RewriteRule^/%1/%2/ [R=302,L,NE] 

RewriteCond %{THE_REQUEST} \s/+([^-]+)-([^.]+)\.html\?v=([^\s&]+) [NC] 
RewriteRule^/%1/%2/%3? [R=302,L,NE] 

RewriteCond %{REQUEST_FILENAME} -d [OR] 
RewriteCond %{REQUEST_FILENAME} -f 
RewriteRule^- [L] 

RewriteRule ^([^/]+)/([^/]+)/?$ /$1-$2.html [L] 

RewriteRule ^([^/]+)/([^/]+)/([^/]+)/?$ /$1-$2.html?v=$3 [L,QSA] 
+0

嗯。這似乎並沒有改變網址。不知道爲什麼。 – gin93r 2014-11-06 16:34:32

+0

你在瀏覽器中輸入什麼URL?你想在瀏覽器中看到'example.com/prefix-suffix.html?v = huzzah',還是想在瀏覽器中看到'example.com/prefix/suffix/huzzah'? – anubhava 2014-11-06 16:39:32

+0

最終結果是我想在瀏覽器中看到'example.com/prefix/suffix/huzzah'。 – gin93r 2014-11-06 16:42:45

1

this是一個很好的參考。總結相關部分:

的SO質疑你是指,在OP想index.php?page=mobile成爲index/page/mobile

和接受這個問題的答案是:

RewriteEngine on 
RewriteBase /cashearn/ 

RewriteCond %{THE_REQUEST} /index\.php\?page=([^\s&]+) [NC] 
RewriteRule^index/page/%1? [R=302,L] 

RewriteCond %{REQUEST_FILENAME} !-d 
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteRule ^index/page/([^/]+)/?$ index.php?page=$1 [L,QSA,NC] 



在爲了理解這是如何工作的,我們來仔細看看這個部分:

RewriteCond %{THE_REQUEST} /index\.php\?page=([^\s&]+) [NC] 
RewriteRule^index/page/%1? [R=302,L] 

RewriteCond是一個必須匹配的條件才能使用後續的RewriteRule。 模式匹配使用正則表達式完成。基礎很容易掌握,所以我建議你看看它。在任何情況下,形式%N(例如%1)的任何形式都是對當前條件集合中的最後一個RewriteCond的模式的「分組」部分的反向引用。 「分組」部分用圓括號表示。換句話說,RewriteRule中的%1指的是RewriteCond中的([^\s&]+)

看着正則表達式:
正則表達式中的方括號表示一個字符類,所以[^\s&]因此是一個字符類。 插入符號^當它是裏面字符類表示否定。 \s是空格字符的轉義碼。因此,總而言之,[^\s&]表示「除空白以外的任何字符」和「&」。字符類附加了+,意思是「一個或多個」。所以,正則表達式模式將匹配字符類中包含的字符之一。對於url而言,這基本上是指字母,數字和%的任意組合。

除了「服務器變量」%{THE_REQUEST}之外,RewriteRule和RewriteCond中的其他字符都是正則表達式的特殊字符或文字。 (文字我的意思是ab在正則表達式將匹配字符串cab。)

^,當不在字符類內時,插入符號是一個特殊字符,表示一行的開始。注意?.這裏也是文字,儘管它們包含在正則表達式「特殊字符」列表中。那是因爲他們逃脫了\

唯一剩下解釋爲標誌[NC][R=302,L]
NC指不區分大小寫。 L表示最後,即如果匹配,則後續規則將而不是被處理。 'R'表示「重定向」,302是重定向的HTTP狀態碼。

內部和外部重定向之間的區別與此處相關。通過內部重定向,服務器將靜靜地從新形成的URL指定的文件路徑中獲取資源,而用戶仍然可以在瀏覽器中看到原始URL。 R標誌表示外部重定向,這會導致用戶使用新形成的URL啓動新的HTTP事務。省略R用於內部重定向。

+0

的很好參考。非常感謝您花時間解釋所有這些。我非常感謝。 :) – gin93r 2014-11-06 17:27:04

+0

這是我的榮幸:) – danyamachine 2014-11-06 17:28:15