我想让我的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文档。