2013-03-22 32 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]