1

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

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

我想要实现的是:

  1. 隐藏 .html 扩展
    用户应该能够在不看到 .html 的情况下键入/bar获取/bar.html(对于每个 .html)
  2. 301 重定向 .html 版本
    用户应该能够在 url 中输入/bar.html和查看/bar(避免重复,对于每个 .html)
  3. 最棘手的部分:
    foo.html默认目录索引一样,输入 / 已经显示(透明)/foo.html,但我需要输入/foo.html来解析到 / 以及输入 /foo 来解析到 /
4

2 回答 2

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 分组在 first/和可能的 last之间/。在下一个条件中使用%1/path/to/www/document/root/%1.html引用它,看看它是否是一个存在的文件。如果两者都为真,它会在内部重写 URI 以.html在末尾包含 a。

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

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

于 2012-10-04T23:21:13.303 回答
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]

我希望这有帮助。

于 2013-11-22T06:30:02.000 回答