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

Posted

技术标签:

【中文标题】隐藏html扩展+重定向.html版本+特殊情况异常【英文标题】:hide html extension + redirect .html version + special case exception 【发布时间】:2012-09-26 01:57:59 【问题描述】:

我很难理解 htaccess mod_rewrite,虽然我找到了几个相关的问题 + 答案,但不幸的是,我无法让我的非常具体的情况正常工作(mod_rewrite 甚至在我搜索了一本七印章的书几个小时后说实话)

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

我想要实现的是:

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

【问题讨论】:

【参考方案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 的那部分。

【讨论】:

我收到 500 内部服务器错误。也许我应该提到文档根是插件域的文档根?这有什么区别吗?老实说,对我来说,你的代码是一本由七个印章组成的书。 发现拼写错误“Option -Multiviews”需要阅读“Options -Multiviews”。还有“%DOCUMENT_ROOT”可能是另一个错字吗?它不应该是“%DOCUMENT_ROOT”吗? @ThomasKuhn 是的,抱歉,我在手机上输入了,让我修复它 好的,除了这两个错别字,它完美无缺!非常感谢!!!真的!只是有点遗憾,我真的没有得到代码。将尽我所能研究以从中学习。再次感谢! @ThomasKuhn 您选中绿色复选标记将其标记为已接受。我会在答案中解释一下【参考方案2】:

我正在使用下面的那个,它可以工作,但在某些奇怪的情况下,当为客户使用 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]

我希望这会有所帮助。

【讨论】:

以上是关于隐藏html扩展+重定向.html版本+特殊情况异常的主要内容,如果未能解决你的问题,请参考以下文章

将我网站上的所有 .html 扩展名重定向到没有扩展名 [重复]

学习SpringMVC(十四)之关于重定向

在被黑网站中隐藏重定向?

如何在没有重定向的情况下提交 HTML 表单

Jmeter中的302重定向&自定义参数&csrfmiddlewaretoken接口实战!

apache调优隐藏版本信息及404重定向