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

Dav*_*itt 43 apache mod-rewrite friendly-url url-rewriting

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

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

然后客户端可以发送风格的书签mydomain.com/foo而不是mydomain.com/foo.html.

这听起来非常简单,mod_rewrite之前我曾经愉快地使用过(比如使用WordPress或重定向),但事实证明这更难破解.也许我错过了一些非常明显的东西,但我无法在任何地方找到解决方案而且我整天都在这里!

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

附录

下面检查的解决方案工作正常.然后在运行该网站一段时间后,我注意到两个问题:

  1. 所有页面都开始显得格格不入.我重新加载,清除缓存等,但仍然没有风格.我以前遇到过这个麻烦,找不到来源.

  2. 有一个目录和一个名为'gallery'的html文件,因此/ gallery链接显示了一个目录列表而不是html文件.我应该可以排序那个,但欢迎进一步提示:-)

Gum*_*mbo 50

试试这条规则:

RewriteCond %{REQUEST_FILENAME}.html -f
RewriteRule !.*\.html$ %{REQUEST_FILENAME}.html [L]
Run Code Online (Sandbox Code Playgroud)

这将重写所有可以在追加时映射到现有文件的请求.html.

  • @AshMenon规则意味着:如果它还没有以`.html`结尾并且结果文件存在,则只附加`.html`. (2认同)

Ste*_*ter 34

以前的答案不会检查请求的路径是否是目录.

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

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
Run Code Online (Sandbox Code Playgroud)

要成为SEO友好并避免双重内容,重定向.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
Run Code Online (Sandbox Code Playgroud)

如果脚本需要相同的内容,请看这里: 如何使用.htaccess隐藏.php URL扩展?

  • 请注意 - 至少从Apache 2.2.23开始 - 显然不支持内联注释,因此上述定义将破坏`.htaccess`文件并导致'500`错误,除非您删除内联注释. (6认同)
  • 如果我使用未修改的定义,则不会重定向以“.html”结尾的路径。如果我从 *2nd* 块中删除 `RewriteCond %{REQUEST_FILENAME}\.html -f`,我最终会得到一个重定向循环(从 Apache 2.2.23 开始)。 (4认同)
  • 您需要两个规则块。第一个在内部将“index”重写为“index.html”,因此用户看不到它。第二个块执行从“index.html”到“index”的 301 重定向。 (3认同)
  • 上面的SEO解决方案不起作用(正如其他几个人已经注意到的那样).尝试`RewriteCond%{THE_REQUEST} ^ [AZ] + \(/ [^ \]*)\.html [?\]`后跟`RewriteRule(.*)\.html $/$ 1 [R = 301,L] `相反 - 对我有用:) (3认同)

小智 12

当网站配置了虚拟主机/文档根时,接受的解决方案不起作用.

有我使用的解决方案:

RewriteEngine on
RewriteCond %{DOCUMENT_ROOT}%{REQUEST_FILENAME}.html -f
RewriteRule !.*\.html$ %{REQUEST_FILENAME}.html [L]
Run Code Online (Sandbox Code Playgroud)