如何用Apache mod_rewrite隐藏.html扩展名

我有一小部分静态网站,我只想隐藏.html扩展名:

  • url /foo获取静态文件/foo.html
  • 浏览器仍然显示url /foo

然后,客户端可以使用mydomain.com/foo而不是mydomain.com/foo.html发送书签。

这听起来很简单,我之前很喜欢使用mod_rewrite (用WordPress或者redirect),但是我认为这很难被破解。 也许我错过了一些非常明显的东西,但是我无法在任何地方find解决scheme,而且我一整天都在这里!

我们运行我们自己的服务器,所以这可以去哪里最好的地方。

附录

下面检查的解决scheme工作正常。 然后在运行一段时间后,我注意到两个问题:

  1. 所有的页面开始显得没有风格。 我重新加载,清除caching等,但仍然没有风格。 我以前遇到过这个麻烦,找不到源代码。

  2. 有一个目录和一个名为“画廊”的HTML文件,所以/画廊链接显示目录列表,而不是HTML文件。 我应该能够sorting,但进一步的提示欢迎:-)

试试这个规则:

 RewriteCond %{REQUEST_FILENAME}.html -f RewriteRule !.*\.html$ %{REQUEST_FILENAME}.html [L] 

这将重写所有的请求,可以映射到一个现有的文件时,附加一个.html文件。

以前的答案不检查请求的path是否是一个目录。

这里是完整的重写条件,如果请求的path是目录(如原始问题所述),则不重写:

 RewriteEngine on RewriteCond %{REQUEST_FILENAME} !-d # is not directory RewriteCond %{REQUEST_FILENAME}\.html -f # is an existing html file RewriteRule ^(.*)$ $1.html # rewrite index to index.html 

要search引擎优化,避免双重内容,redirect.htmlurl:

 # Redirects domain.com/file.html to domain.com/file RewriteCond %{REQUEST_FILENAME} !-d # is not directory RewriteCond %{REQUEST_FILENAME}\.html -f # is an existing html file RewriteCond %{REQUEST_URI} ^(.+)\.html$ # request URI ends with .html RewriteRule (.*)\.html$ /$1 [R=301,L] # redirect from index.html to index 

如果你需要相同的脚本看看这里: 我怎样才能使用.htaccess来隐藏。PHP的URL扩展?

当网站configuration了虚拟主机/文档根目录时,接受的解决scheme不起作用。

有我使用的解决scheme:

 RewriteEngine on RewriteCond %{DOCUMENT_ROOT}%{REQUEST_FILENAME}.html -f RewriteRule !.*\.html$ %{REQUEST_FILENAME}.html [L] 

看看这篇文章http://alexcican.com/post/how-to-remove-php-html-htm-extensions-with-htaccess/我还没有尝试过,但演示似乎很有说服力。;

 Options -MultiViews RewriteEngine On RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{REQUEST_FILENAME} !-f RewriteRule ^([^\.]+)$ $1.php [NC,L] 

要从.*.html请求中删除.html扩展名,您可以在root/.htaccess使用以下脚本:

 RewriteEngine On RewriteBase / #1) externally redirect "/file.html" to "/file" RewriteCond %{THE_REQUEST} ^[AZ]{3,}\s([^.]+)\.html [NC] RewriteRule ^ %1 [R=301,L] #2) rewrite "/file" back to "/file.html" RewriteCond %{REQUEST_FILENAME}.html -f RewriteRule ^(.*?)/?$ $1.html [NC,L] 

这里是一个允许我们将文件存储在磁盘上的例子:

 foo.html.php 

但在浏览器中,请参考

 foo.html 

为了使你的工作,我认为你只需要修改一下,以符合您现有的要求,并检查一个实际的文件与.html扩展名。

  # These are so we do not need the .php extension RewriteCond %{REQUEST_FILENAME} (\.xul|\.html|\.xhtml|\.xml)$', RewriteCond %{DOCUMENT_ROOT}%{REQUEST_FILENAME}.php -f', RewriteRule ^(.*)$ $1.php', 

哇,我很less看到networking上存在这么多“解决scheme”的问题,人们只是抛出“为他们工作”的东西,但是很less有人花时间阅读文档来弄清楚它的function。 例如,这里给出的许多解决scheme不适用于虚拟主机。

经过多次交叉引用和阅读,我想贡献自己的解决scheme,“为我工作”。 希望它也适用于你。 我没有从头开始创build它; 我受到了所有其他贡献的启发(尽pipe其中大多数没有修改“不为我工作”)。

 RewriteEngine on #if foo requested, return foo.html contents RewriteCond %{DOCUMENT_ROOT}%{REQUEST_URI} !-d RewriteCond %{DOCUMENT_ROOT}%{REQUEST_URI}\.html -f RewriteRule ^(.*)$ $1.html [L] #redirect foo.html to foo RewriteCond %{DOCUMENT_ROOT}%{REQUEST_URI} !-d RewriteRule ^(.+)\.html$ $1 [R,L] 

默认情况下, [R]标志执行临时(302)redirect; 如果你想永久redirect,使用R=301代替R