2

我正在尝试使用 .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 指令正在工作。

4

2 回答 2

1

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

Options +FollowSymLinks

RewriteEngine on

RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME}\.html -f
RewriteRule ^(.*)$ $1.html
于 2013-01-04T22:29:54.890 回答
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]
于 2013-01-04T23:14:29.670 回答