隐藏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 扩展名重定向到没有扩展名 [重复]