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

我很难理解 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 来解析到/

【问题讨论】:

    标签: .htaccess mod-rewrite


    【解决方案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]
    

    我希望这会有所帮助。

    【讨论】:

      猜你喜欢
      • 2014-04-10
      • 2020-05-12
      • 1970-01-01
      • 1970-01-01
      • 2011-11-14
      • 2013-05-02
      • 2013-03-13
      • 2022-07-30
      • 1970-01-01
      相关资源
      最近更新 更多