2013-03-22 33 views
1

我想從擴展URL重定向到無擴展URL。例如,/ contact應該讀取/contact.php的內容。我使用以下規則來實現此目的:mod_rewrite規則500內部服務器錯誤

RewriteEngine On 

RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteCond %{REQUEST_FILENAME}.php -f 
RewriteRule ^(.+)$ $1.php [L,QSA] 

有一個名爲test.php的文件,其中有一個名爲「id」的變量。我想重定向從/測試/ 1〜test.php的ID讀請求= 1

我使用以下方法來實現這一目標:?

RewriteRule ^test/([0-9]+)/?$   /test?id=$1  

出於某種原因調用測試/ 1文件導致500內部服務器錯誤。如果我刪除規則來隱藏php擴展,它再次運作

另外我怎樣才能強制永久重定向URL的擴展名?例如,如果某人的聯繫,達到/contact.php應該被重定向到/接觸

感謝

+0

是集RewriteConditions和重寫規則之後的第二次重寫規則添加到直接請求到PHP文件? – 2013-03-22 20:43:25

+0

抱歉不能理解你的問題:( – 2013-03-22 20:45:01

+0

你可以顯示完整的htaccess文件,所以我們知道你提到的兩套重寫規則相對於對方的位置? – 2013-03-22 20:46:29

回答

1

您可以使用此代碼:

Options +FollowSymLinks -MultiViews 
# Turn mod_rewrite on 
RewriteEngine On 
RewriteBase/

# your existing rule (fixed) 
RewriteRule ^test/([0-9]+)/?$ /test.php?id=$1 [L,NC,QSA] 

## hide .php extension 
# To externally redirect /dir/foo.php to /dir/foo 
RewriteCond %{THE_REQUEST} ^[A-Z]{3,}\s([^.]+)\.php [NC] 
RewriteRule^%1 [R=301,L] 

## To internally forward /dir/foo to /dir/foo.php 
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteCond %{REQUEST_FILENAME}.php -f 
RewriteRule ^(.+)$ /$1.php [L] 
+0

this仍然產生相同的錯誤 – 2013-03-22 20:50:42

+0

你能否請你檢查你的error.log並告訴我你的錯誤是什麼 – anubhava 2013-03-22 20:53:56

+0

也請參閱編輯的答案我將你的'test.php'規則移到了其他規則之上 – anubhava 2013-03-22 20:55:26

0

這是我htaccess ......一定要已經mod_rewrite Apache中打開...

RewriteEngine On 
# Redirect .php requests to url without an extension 
RewriteCond %{THE_REQUEST} ^(.+)\.php([#?][^\ ]*)?\ HTTP/ 
RewriteRule ^(.+)\.php$ http://example.com/folder/$1 [R=301,L] 
RewriteRule ^([^/.]+)$ $1.php [L] 
# This will remove the trailing slash unless it's a directory 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteRule ^([^/]+)/$ http://example.com/folder/$1 [R=301,L]