如果文件存在于干净的URL,则使用modrewrite重写

时间:2011-07-18 16:45:11

标签: .htaccess url mod-rewrite url-rewriting

为了拥有一个很好的干净网址与某种网站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

这可能吗,我该如何实现?

2 个答案:

答案 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>
  1. 如果您使用的是<IfModule mod_rewrite.c>,请将所有重写规则放在代码之间,而不仅仅是RewriteEngine On

  2. 规则检查在重写之前是否存在扩展名为.html的文件。对于http://example.com/first/second/,它会检查WEBSITE_ROOT/first/second.html是否存在。如果没有 - 那将保持原样,并且Apache将自动选择http://example.com/first/second/index.html,因为DirectoryIndex index.html指令(参见第一行)。

  3. 请注意:从重写引擎的角度来看,这两个网址被视为相同:http://example.com/first/second/http://example.com/first/second(请注意,没有尾部斜杠)。如果您希望这是2个不同的URL(仅使用尾部斜杠重写一个),则从上次重写规则中删除?[^/](例如RewriteRule ^(.+)/$ $1.html [L,QSA])。

  4. 对于网址http://example.com/first/second/ - 如果您同时拥有文件夹/first/second/和文件/first/second.html,则请求将转到文件夹(并且/first/second/index.html将是最终的URL - 见#2)。

答案 1 :(得分:0)

您可以使用RewriteCond something -f检查某些内容是否确实是文件。对于目录,可以改为使用-d标志。