如何隐藏.html扩展与Apache的mod_rewrite如何隐藏.html扩展与Apache的m

2019-05-08 21:50发布

我有一个小数量的静态网站,我只是想隐藏.html扩展名的:

  • 网址/foo获取静态文件/foo.html
  • 该浏览器仍然显示的URL /foo

然后,客户机可以在风格送出书签mydomain.com/foo而非mydomain.com/foo.html

这听起来很简单,我已经使用mod_rewrite愉快之前(与WordPress或重定向说的),但是这证明更难破解,我认为。 也许我失去了一些东西真的很明显,但我不能在任何地方找到一个解决方案,我一直在这一切的一天!

我们运行我们自己的服务器,所以这次能去的地方是最好的地方。

附录

下面检查的解决方案工作得很好。 随后一段时间运行后,现场我注意到两个问题:

  1. 所有页面开始出现无样式。 我重新加载,清除缓存等,但仍然没有风格。 我以前也有这样的烦恼,并不能找到源。

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

Answer 1:

试试这个规则:

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

这将改写,可以追加当被映射到一个现有的文件中的所有请求.html



Answer 2:

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

这里是一个不重写,如果请求的路径是一个目录(如原题说明)的全部重写条件:

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

为了搜索引擎友好和避免双重内容,重定向的URL的.html:

# 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扩展?



Answer 3:

接受的解决方案做当网站配置了虚拟主机/文档根不工作。

还有就是我用的解决方案:

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


Answer 4:

看看这个帖子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]


Answer 5:

要删除.html从扩展.*.html请求,您可以使用下面的脚本root/.htaccess

RewriteEngine On
RewriteBase /
#1) externally redirect "/file.html" to "/file"
RewriteCond %{THE_REQUEST} ^[A-Z]{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]


Answer 6:

这里是一个可以让我们的文件存储在磁盘上作为一个例子:

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',


Answer 7:

哇,我很少见到了其中存在的网络,人们只是扔了什么“为他们工作”,但对其中很少花时间阅读文件,以找出它做什么这么多的“解决方案”这样一个问题。 许多这里给出的解决方案没有为虚拟主机的工作,例如。

经过大量交叉引用和阅读,我想贡献我自己的解决方案,“对我的作品”。 希望它为你工作了。 我没有从头创建; 我得到了所有的其他贡献(尽管其中大部分没有“我的工作”不加修改)的启发。

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)重定向; 如果你想有一个永久重定向,使用R=301代替R



文章来源: How to hide the .html extension with Apache mod_rewrite