为了拥有一个很好的干净网址与某种网站archetecture我在我的.htaccess文件中使用modrewrite。我不想要文件扩展名(.php或.html)。
我有以下内容:
<IfModule mod_rewrite.c>
RewriteEngine On
</IfModule>
RewriteRule ^([a-zA-Z0-9-]+)/$ $1.html [L]
RewriteRule ^([a-zA-Z0-9-]+)/([a-zA-Z0-9-]+)/$ $1/$2.html [L]
RewriteRule ^([a-zA-Z0-9-]+)/([a-zA-Z0-9-]+)/([a-zA-Z0-9-]+)/$ $1/$2/$3.html [L]
但是我希望它首先检查子目录中是否存在index.html文件。 例如,我想要
http://example.com/first/
重写为
http://example.com/first.html
但如果不存在则重写为
http://example.com/first/index.html
对于子指南也是如此,例如我想要
http://example.com/first/second/
重写为
http://example.com/first/second.html
但如果不存在则重写为
http://example.com/first/second/index.html
这可能吗,我该如何实现?
答案 0 :(得分:4)
这对你有用(适合我):
DirectoryIndex index.html
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
# Do not do anything for already existing files and folders
RewriteCond %{REQUEST_FILENAME} -f [OR]
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule .+ - [L]
# add .html file extension (if such file does exist)
RewriteCond %{DOCUMENT_ROOT}/$1\.html -f
RewriteRule ^(.+[^/])/?$ $1.html [L,QSA]
</IfModule>
如果您使用的是<IfModule mod_rewrite.c>
,请将所有重写规则放在代码之间,而不仅仅是RewriteEngine On
。
规则检查在重写之前是否存在扩展名为.html的文件。对于http://example.com/first/second/
,它会检查WEBSITE_ROOT/first/second.html
是否存在。如果没有 - 那将保持原样,并且Apache将自动选择http://example.com/first/second/index.html
,因为DirectoryIndex index.html
指令(参见第一行)。
请注意:从重写引擎的角度来看,这两个网址被视为相同:http://example.com/first/second/
和http://example.com/first/second
(请注意,没有尾部斜杠)。如果您希望这是2个不同的URL(仅使用尾部斜杠重写一个),则从上次重写规则中删除?
和[^/]
(例如RewriteRule ^(.+)/$ $1.html [L,QSA]
)。
对于网址http://example.com/first/second/
- 如果您同时拥有文件夹/first/second/
和文件/first/second.html
,则请求将转到文件夹(并且/first/second/index.html
将是最终的URL - 见#2)。
答案 1 :(得分:0)
您可以使用RewriteCond something -f
检查某些内容是否确实是文件。对于目录,可以改为使用-d标志。