我目前正在使用以下 .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]