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



我很难理解htaccess mod_rewrite,虽然我找到了几个相关的问题和答案,但不幸的是,我无法正确处理我的特定情况(老实说,mod_rewrite是在我搜索了一本七章的书数小时后)

我的根目录中有foo.html和bar.html。现在,我希望将foo.html作为默认目录索引(已解决,很容易),但从那里我就无法获得它

我想要实现的是:

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

尝试将这些规则放在文档根目录的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

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

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

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

我使用的是下面的一个,它很有效,只是在某些奇怪的情况下,当为客户端使用保修脚本时,它根本做不到。

然而;通过子文件夹中的iFrame调用外部脚本的其他脚本似乎可以工作,但保修脚本除外。。。

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]

我希望这能有所帮助。

相关内容

最新更新