htaccess:只删除特定文件或文件夹的PHP扩展

我目前在/public_html/.htaccess中使用以下去除.php扩展名和强制结尾斜线。

# Remove .php extension RewriteCond %{THE_REQUEST} ^GET\ /[^?\s]+\.php RewriteRule (.*)\.php$ /$1/ [L,R=301] RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{REQUEST_URI} ^/(.+)/$ RewriteCond %{DOCUMENT_ROOT}/%1.php -f RewriteRule ^(.*)/$ $1.php [L] # Force trailing slash RewriteCond %{REQUEST_FILENAME}.php -f RewriteRule .*[^/]$ $0/ [L,R=301] 

这完美的工作,但是,/ public_html的子文件夹中有一些PHP文件,我们不希望被重写。

如何修改重写+结尾斜杠以仅应用于/ public_html文件夹中的PHP文件,或者指定该规则适用的PHP文件列表?

更新:在我的情况下,我相信最好的解决scheme将剥离PHP扩展(并添加尾部斜杠)只显式指定的文件,而不是创build基于文件夹的条件。

更新2:工作解决scheme:

 #Remove PHP extension from named files RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{REQUEST_FILENAME} !-f RewriteRule ^(file1|file2)/?$ /$1.php [L,NC] 

你可以简单地在你的.htaccess文件的开头创build一个exception…如果请求匹配其中一个子文件夹( 并且是一个现有的PHP文件?),则停止重写过程。 例如:

 RewriteRule ^(subfolder1|subfolder2)$ - [L] 

如果你只是想跳过所有的请求,那么你可以在那里停下来。 如果你特别需要跳过重写,如果它匹配现有的PHP文件,那么:

 RewriteCond %{REQUEST_FILENAME} -f RewriteRule ^(subfolder1|subfolder2)/.+\.php$ - [L] 

如果请求为/subfolder1/<something>.php和该文件存在然后停在这里。

更新#1:

我们只希望将其应用于/ public_html中的PHP文件,而不是其子文件夹

您可能仍然可以在现有规则之前执行此操作。 如果请求包含一个斜杠(即它是为一个子文件夹)然后中止。 例如:

 RewriteRule /.*/?$ - [L] 

或者,改变你现有的RewriteRule的模式来匹配除了斜线之外的任何东西(即[^/]* )而不是字面上的所有东西(即.* )。 适用于您现有的规则:

 RewriteRule ^([^/]*)\.php$ /$1/ [L,R=301] : RewriteRule ^([^/]*)/$ $1.php [L] : RewriteRule ^[^/]*$ $0/ [L,R=301] 

更新#2:添加锚定到上面的RewriteRule模式。

更新#3:使上述内容适用于文档根目录中的特定文件。 您将使用排除所有其他文件的exception(如上所述)。 例如:

 RewriteRule !^(file1|file2|file3|file4) - [L] 

为了允许启动 /file1/file2/file3等所有URL(通过RewriteRule模式匹配的URL不以每个目录.htaccess文件中的斜杠开始)。

在上下文中…

 Options -MultiViews RewriteEngine On # Only allow specific requests to be processed... RewriteRule !^(file1|file2|file3|file4) - [L] # Remove .php extension RewriteCond %{THE_REQUEST} ^GET\ /[^?\s]+\.php RewriteRule (.*)\.php$ /$1/ [L,R=301] # Force trailing slash RewriteCond %{REQUEST_FILENAME}.php -f RewriteRule .*[^/]$ $0/ [L,R=301] # Route request... RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{REQUEST_URI} ^/(.+)/$ RewriteCond %{DOCUMENT_ROOT}/%1.php -f RewriteRule ^(.*)/$ $1.php [L]