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



我想让我的URL变得漂亮。

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呢?它们在做什么?

针对-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的mod_rewrite文档。

最新更新