隐藏html扩展名+重定向.html版本+特殊情况例外

时间:2012-10-04 23:09:45

标签: .htaccess mod-rewrite

我很难理解htaccess mod_rewrite,虽然我发现了几个相关的问题+答案,但遗憾的是我无法让我的具体情况正常工作(mod_rewrite甚至是经过几个小时的搜索七本海豹的书给我说实话)

我的根目录中有foo.html和bar.html。现在,我想将foo.html作为默认目录索引(解决,简单),但从那里我得不到它。

我想要实现的目标是:

  1. 隐藏.html扩展名 用户应该可以输入/bar来获取/bar.html而不会看到.html(对于每个.html)
  2. 301重定向.html版本
    用户应该可以输入/bar.html并在网址中查看/bar(避免重复,每个.html)
  3. 最棘手的部分:
    由于foo.html是默认目录索引,因此键入/已经显示(透明地)/foo.html,但我需要键入/foo.html来解析/以及键入/ foo以解析为/

2 个答案:

答案 0 :(得分:1)

尝试将这些规则放在文档根目录中的htaccess文件中:

RewriteEngine

# 1. hiding the .html extensions
RewriteCond %{REQUEST_URI} ^/(.*?)/?$
RewriteCond %{DOCUMENT_ROOT}/%1.html -f
RewriteRule ^ /%1.html [L]

# 2. 301 redirecting .html version
RewriteCond %{THE_REQUEST} ^[A-Z]{3,9}\ /([^\ ]+)\.html
RewriteCond %1 !foo$
RewriteRule ^ /%1 [L,R=301]

# 3. typing /foo.html to resolve to / as well as typing /foo to resolve to / 
RewriteCond %{REQUEST_URI} ^/(.*?/?)foo(\.html)?$
RewriteRule ^ /%1 [L,R=301]

另外,请确保关闭了多视图:

Options -Multiviews

第一条规则有2个条件,第一条规则将URI分配给第一个/和可能的最后一个/。在下一个条件中使用%1 引用它,查看/path/to/www/document/root/%1.html是否是存在的文件。如果两者都为真,则它会在内部重写URI以在末尾包含.html

第二个规则有2个条件,第一个匹配实际请求而不是URI(可以随着规则的应用和重写发生而改变)。它会查看是否有以.html结尾的请求,如果是,则第二个条件确保它不是foo.html请求(因为最后一条规则处理该请求)。如果两者都为真,那么它会将浏览器重定向到不带html的URI部分,再次使用%1 来引用第一个条件([^\ ]+)的匹配中的分组。

最后一条规则会检查请求是针对foo还是foo.html。如果是这样,重定向删除URI的那一部分。

答案 1 :(得分:0)

我正在使用下面的那个,它的工作原理除外,在一些奇怪的情况下,当为客户使用WARRANTY脚本时,它只是不会做这件事。

然而;通过子文件夹中的iFrame调用外部脚本的其他脚本似乎可以使用WARRANTY脚本除外。 ......

Options +FollowSymLinks  -MultiViews
RewriteEngine on
RewriteBase /

RewriteCond %{ENV:REDIRECT_END}  =1
RewriteRule ^ - [L,NS]

RewriteCond %{REQUEST_FILENAME} -f
RewriteRule ^(.*?)\.(php|html?)$        $1   [R=301,NC,NS]

RewriteCond %{REQUEST_FILENAME}\.html -f
RewriteRule (.*)$ $1.html   [L,E=END:1,NS]

RewriteCond %{REQUEST_FILENAME}\.htm -f
RewriteRule (.*)$ $1.htm    [L,E=END:1,NS]

RewriteCond %{REQUEST_FILENAME}\.php -f
RewriteRule (.*)$ $1.php    [L,E=END:1,NS]

我希望这有助于。