mod_rewrite丢失文件扩展名,重写,并使用或不使用尾部斜杠

时间:2012-08-23 12:57:29

标签: .htaccess mod-rewrite

我想让我的网址漂亮。

example.com/en/directions.php

example.com/en/directions/

两者都应重写为

example.com/en/directions

<IfModule mod_rewrite.c>
    RewriteEngine On
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond %{REQUEST_FILENAME}\.php -f
    RewriteRule ^(.*)$ $1.php
</IfModule>

这当前在example.com/en/directions/上生成500错误,并将.php保留为example.com/en/directions.php

如果你能让我了解重写条件和重写规则的工作原理,那么

奖励积分。它是否遵循如果这些条件中的任何一个符合,那么执行此操作。那么-d-f呢,他们在做什么?

1 个答案:

答案 0 :(得分:0)

针对-f的检查因尾部斜杠而失败,因此您需要对其进行额外检查,而不使用可能的尾部斜杠:

<IfModule mod_rewrite.c>
    RewriteEngine On
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond %{REQUEST_URI} ^(.*?)/?$
    RewriteCond %{DOCUMENT_ROOT}/%1.php -f
    RewriteRule ^(.*?)/?$ $1.php
</IfModule>
  

重写条件和重写规则的工作原理。如果这些条件中的任何一个匹配,它会遵循这样做。那么-d和-f呢,他们在做什么?

规则之前的任意数量的条件仅适用于该规则,并且它们都需要匹配。如果您想要一个条件另一个条件,那么您可以在条件结束时包含[OR]标志:

    RewriteCond %{REQUEST_FILENAME} !-d [OR]
    RewriteCond %{REQUEST_FILENAME} !-f

对于-f-d,它们是资源检查,以查看给定路径是指向文件还是目录。有关完整说明,请参阅apache's mod_rewrite docs