Apache2重写规则不起作用

时间:2013-01-04 22:18:57

标签: .htaccess mod-rewrite apache2

我正在尝试使用.htaccess中的代码从我的网址中删除.html扩展名(在线找到的代码)。

Options +FollowSymLinks

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)\.html$ /$1 [L,R=301] 

它不起作用。我发现一篇帖子说要用它来测试是否启用了mod-rewrite:/usr/local/apache/bin/httpd -D DUMP_MODULES | grep rewrite

它返回:

Syntax OK
 rewrite_module (static)

错误日志中没有任何内容。如果重要的话,这是在具有WHM和cPanel的服务器上。我的其他.htaccess指令正在运行。

2 个答案:

答案 0 :(得分:1)

您的代码与您要完成的代码完全相反。正确的代码是:

Options +FollowSymLinks

RewriteEngine on

RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME}\.html -f
RewriteRule ^(.*)$ $1.html

答案 1 :(得分:1)

如果您请求现有的html文件,这些条件将阻止规则执行任何操作:

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d

因为他们说,如果请求的文件不存在而且不是目录......当你请求一个html文件时,它将失败-f测试。所以规则什么都不做。

您希望与实际请求匹配:

RewriteCond %{THE_REQUEST} \ /([^.]+)\.html($|\ |\?)
RewriteCond %{REQUEST_FILENAME} -f
RewriteRule ^ /%1 [L,R=301]

这会将对现有HTML文件的请求重定向到相同的路径,但减去扩展名。然后你可以在内部重写它:

RewriteCond %{REQUEST_FILENAME}\.html -f
RewriteRule ^(.*)$ /$1.html [L]