我很难理解htaccess mod_rewrite,虽然我发现了几个相关的问题+答案,但遗憾的是我无法让我的具体情况正常工作(mod_rewrite甚至是经过几个小时的搜索七本海豹的书给我说实话)
我的根目录中有foo.html和bar.html。现在,我想将foo.html作为默认目录索引(解决,简单),但从那里我得不到它。
我想要实现的目标是:
/bar
来获取/bar.html
而不会看到.html(对于每个.html)/bar.html
并在网址中查看/bar
(避免重复,每个.html)foo.html
是默认目录索引,因此键入/已经显示(透明地)/foo.html
,但我需要键入/foo.html
来解析/以及键入/ foo以解析为/ 答案 0 :(得分: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的那一部分。
答案 1 :(得分: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]
我希望这有助于。