如何用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工作正常。 然后在运行一段时间后,我注意到两个问题:
-
所有的页面开始显得没有风格。 我重新加载,清除caching等,但仍然没有风格。 我以前遇到过这个麻烦,找不到源代码。
-
有一个目录和一个名为“画廊”的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