2014-06-18 68 views
0

我創建了一個簡單的重寫URL是這樣的:確保重寫規則是用來

RewriteRule ^messages$ /messages.php [L] 

如何強制用戶使用/消息並沒有/messages.php?也就是說,如果用戶查詢messages.php,他將被301重定向到/ messages。

我有一個很長的重寫規則列表,像上面那樣。

RewriteEngine On 
RewriteRule ^messages$ /messages.php [L] 
RewriteRule ^events$ /events.php [L] 
RewriteRule ^cv$ /cv.php [L] 
RewriteRule ^profile/([^/]*)$ /profile.php?id=$1 [L] 
RewriteRule ^ratings$ /ratings.php [L] 
RewriteRule ^newsfeed$ /newsfeed.php [L] 
RewriteRule ^logout$ /logout.php [L] 
RewriteRule ^profile$ /profile.php [L] 
RewriteRule ^ranking$ /rank.php [L] 
RewriteRule ^find-study$ /search.php [L] 
RewriteRule ^search/$ /search.php [L] 
RewriteRule ^search$ /search.php [L] 
RewriteRule ^invite-friends$ /invite-friends.php [L] 
RewriteRule ^profile/([^/]*)$ /profile.php?id=$1 [L] 
RewriteRule ^profile/([^/]*)/([^/]*)$ /profile.php?id=$1&programme=$2 [L] 
RewriteRule ^student-requests$ /student-requests.php [L] 

# Q&A 

    # view question 
     RewriteRule ^question(?:/([^/]+)(?:/([^/]*))?)?/?$ /question.php?id=$1&permalink=$2 [L] 
     RewriteRule ^question/([^/]*)/([^/]*)/([^/]*)$ /question.php?id=$1&permalink=$2&answer=$3 [L] 

    # manage question 
     RewriteRule ^ask(?:/([^/]+)(?:/([^/]*))?)?/?$ /manageQuestion.php?tag_id=$1&tag_type=$2 [L] 
     RewriteRule ^ask/([^/]*)/([^/]*)/([^/]*)$ /manageQuestion.php?tag_id=$1&tag_type=$2&tag_name=$3 [L] 

     RewriteRule ^editquestion(?:/([^/]+)(?:/([^/]*))?)?/?$ /manageQuestion.php?id=$1&second=$2 [L] 

    # questions 
     RewriteRule ^questions$ /questions.php [L] 
     RewriteRule ^questions/([^/]*)$ /questions.php?first=$1 [L] 
     RewriteRule ^questions/([^/]*)/([^/]*)$ /questions.php?first=$1&second=$2 [L] 
     RewriteRule ^questions/([^/]*)/([^/]*)/([^/]*)$ /questions.php?first=$1&second=$2&third=$3 [L] 
     RewriteRule ^questions/([^/]*)/([^/]*)/([^/]*)/([^/]*)$ /questions.php?first=$1&second=$2&third=$3&fourth=$4 [L] 

回答

1

當試圖解決這個問題時,你可能遇到了無限循環的問題。防止這種情況的一種方法是使用%{THE_REQUEST},因爲這個變量在重寫時不會改變。因此,如果您使用以下規則,這將改變.php結束到URL每個URL沒有它:

RewriteCond %{THE_REQUEST} ^(GET|POST)\ /(messages|events|cv|ratings|etc)\.php\ HTTP 
RewriteRule^%2 [R,L] 

測試該規則正常工作後,改變[R,L][R=301,L]使重定向永久。在一切正常工作之前這樣做會使測試變得很痛苦。

編輯:而不是使用(.*)你可以使用/(page1|page2|page3)所有簡單的重定向。對於每一個更復雜的,你可能需要有一個單一的重定向每個形式:

RewriteCond %{THE_REQUEST} ^(GET|POST)\ /questions\.php\?id=([^&]+)&permalink=([^&]+)&answer=([^&]+)\ HTTP 
RewriteRule^questions/%2/%3/%4 [R,L] 
+0

謝謝你的快速答案。但是,我不想讓每個頁面都重定向。有更聰明的方法嗎?我已經更新了我的原始答案,並預覽了我的重定向規則的外觀。 – FooBar

+0

我已經更新了我的答案;你可能不會比這更聰明。 – Sumurai8