2013-03-01 50 views
1

我一直在尋找通過問題和答案的天試圖找出如何使這項工作。Mod_Rewrite爲URL

到目前爲止,我可以讓我的網址改變,但它不會加載頁面。

我不得不採取

http://www.mysite.com/index.php?mode=about

而且有它顯示爲

http://www.mysite.com/about/

到目前爲止,我有以下代碼:

RewriteEngine on 
RewriteCond %{QUERY_STRING} ^mode=(.*) 
RewriteRule^http\:\/\/\www.mysite.com\/%1? [R=301,L] 

RewriteRule /(.*) /index.php?mode=%1 [L] 

我已經改變事情多次而不是興。大多數網站似乎告訴我,我不需要301重定向,但我不能得到任何工作。

+0

所以URL確實會改變(表明你的重寫正在工作),但是當你最終在'/ about /'頁面'index.php?mode = about'不會加載?或者你需要重寫固定,以便正確路由到'/ about /'? – GordonsBeard 2013-03-01 02:17:39

+0

是的,這是正確的。我得到我的頁面錯誤,說「頁面未找到」,但它確實顯示了我想要在地址欄中顯示的正確信息 – 2013-03-01 02:43:43

+0

我說如果你只留下'RewriteEngine on'和'RewriteRule /(.*)/index.php?模式=%1 [L]'並擺脫其餘的,它應該工作。 – 2013-03-01 03:10:31

回答

0

對於您的示例,一旦您從mysite.com/index.php?mode=about正確路由到mysite.com/about,它現在將查看mysite.com/about/以查找下一個內容(index.py/index.html/etc)。

因爲沒有在/about/,你得到一個404錯誤。

我不認爲你可以使用mod_rewrite來完成你想要達到的目標,而不需要在/about/之內進行一些處理,以便在你到達目的地後實際顯示你想要的頁面。

http://www.noupe.com/php/10-mod_rewrite-rules-you-should-know.html

記住文件系統始終優先

文件系統的服務器上總是優先於 重寫URL。舉例來說,如果你有一個名爲「服務」 和目錄中是一個名爲「design.html」的文件,你不能 有URL重定向到「http://domain.com/services」。 Apache將進入「服務」目錄並且沒有看到 重寫指令,會發生什麼情況是 。

若要解決此問題,只需重命名您的目錄(將下劃線添加到 開頭或結尾是一種簡單的方法)。

+0

我不確定我關注。我應該用下劃線重命名哪個目錄?它是在名稱之前還是之後出現? – 2013-03-01 03:42:05

0

我不得不採取

http://www.mysite.com/index.php?mode=about

而且有它顯示爲

http://www.mysite.com/about/

有兩種很常見的類型的規則,人們希望和你的陳述可以被解釋爲兩種需要的方式不同的規則。我要解釋你的陳述,你有一個真實的操作腳本http://www.mysite.com/index.php?mode=about,但是不要讓用戶輸入那個「醜陋」的URL,而是希望他們在輸入http://www.mysite.com/about/時得到該URL。要做到這一點,你會做以下幾點:

RewriteRule ^about/?$ /index.php?mode=about [L] 

因爲誤解的潛力,這是最好的狀態,你想爲(1)什麼用戶將進入他們的瀏覽器和(2)什麼是真正的文件是什麼你想爲他們服務。

+0

當我使用您建議的內容時,沒有任何反應。我的網站就像代碼不在那裏一樣。 – 2013-03-01 03:34:30

0

我不相信你需要線#2 你似乎有%,而不是$,請嘗試:

RewriteEngine on 
RewriteRule ^([^\/]+) /index.php?mode=$1 [L] 
+0

內部服務器錯誤 服務器遇到內部錯誤或配置錯誤,無法完成您的請求。 請聯繫服務器管理員[email protected]並告知他們錯誤發生的時間,以及您可能造成錯誤的任何事情。 有關此錯誤的更多信息可能在服務器錯誤日誌中可用。 此外,嘗試使用ErrorDocument處理請求時遇到500內部服務器錯誤錯誤。 – 2013-03-01 03:38:47

+0

試過你的代碼,它給了我上面的服務器錯誤 – 2013-03-01 03:39:07

+0

@Ni Ck,用另一個版本在底部更新了答案;) – 2013-03-01 03:49:00

0

解決的問題。感謝所有的幫助。


#< IfModule mod_rewrite.c>

#RewriteEngine敘述上

#的RewriteCond%{} REQUEST_FILENAME!-f

#的RewriteCond%{} REQUEST_FILENAME!-d

#</IfModule>

個選項+了FollowSymLinks

RewriteEngine敘述上

重寫規則^([A-ZA-Z0-9 _-] +)$的index.php?模式= $ 1

重寫規則^([A-ZA-Z0 ?-9 _-] +)/ $的index.php模式= $ 1

+0

我明白了。儘管本網站上可能有類似的答案,但我會建議將此答案標記爲已接受,以便其他人可以看到正確的答案。你還可以通過添加將你的2條線合併成一條?在結束括號之後,可能會添加QUERY_STRING(例如:'RewriteRule ^([a-zA-Z0-9 _-] +)/?$ index.php?mode = $ 1&%{QUERY_STRING}'),所以您不會放棄如果你希望在你的新URL之後有額外的變量,例如'/ about /?anotherVar = extra',它將和'index.php?mode = about&anotherVar = extra'相同。 – 2013-03-01 14:15:36

+0

這是一個很好的觀點。謝謝。 它不會讓我把它檢查到明天。 – 2013-03-01 20:40:30

+0

如何獲取第二個變量並將其遮罩?所以不是有/ about /?anotherVar = extra我有/ about/extra。第二個變量在某些頁面上並非全部是 – 2013-03-09 19:11:57

0

您可以使用此:

RewriteEngine on 

RewriteCond %{REQUEST_FILENAME} -d 
RewriteRule ^.*$ - [L] 

RewriteRule ^([^/]+)/$ /index.php?mode=$1 [L] 

哪裏開始仍然允許其他文件夾來訪問。