Apache mod_rewrite - 删除扩展名/添加尾部斜杠/保留目录结构

Apache mod_rewrite - 删除扩展名/添加尾部斜杠/保留目录结构

我目前正在使用以下 .htaccess 文件从我的文件中删除 .php 扩展名并在所有 URL 后添加一个尾随斜杠:

RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME}\.php -f
RewriteRule ^([^/]+)/$ $1.php

# Forces a trailing slash to be added
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_URI} !(\.[a-zA-Z0-9]{1,5}|/)$
RewriteRule (.*)$ /$1/ [R=301,L]

这很好用,但是,当我在目录中有一个 php 文件,并且我想从目录中提供该文件时,我收到 404 错误。有没有办法在根目录中使用 1 个 .htaccess 文件来做到这一点。我真的不想记住在每个目录中放置一个 .htaccess 文件。

现在

www.myexample.com/information/

服务/information.php。很棒!然而

www.myexample.com/categories/category-1/

尽管文件/categories/category-1.php确实存在,但还是会抛出 404。我想修改我的 .htaccess 文件,以便它能正常工作/categories/category-1.php

答案1

第一个重写规则的正则表达式模式是原因:^([^/]+)/$意味着除斜线外的任意字符/。因此,它会拒绝位于子文件夹中的所有内容。

您应该使用^(.+)/$模式来代替——这将适用于/information/以及/categories/category-1/以及/categories/category-1/hello-kitten/

附言我还将添加L标志以停止匹配进一步的规则:

# add .php file extension
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME}\.php -f
RewriteRule ^(.*[^/])/?$ $1.php [L]

相关内容