htaccess:仅为特定文件或文件夹删除 PHP 扩展

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 文件列表?

更新: 就我而言,我相信最佳解决方案是仅对明确指定的文件剥离 PHP 扩展(并添加尾随斜杠),而不是创建基于文件夹的条件。

更新2: 工作解决方案:

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

答案1

您可以在文件开头简单地设置一个例外.htaccess...如果请求与这些子文件夹之一匹配(是否为现有 PHP 文件?则停止重写过程。例如:

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

如果您只是想跳过所有请求,那么您可以停在那里。如果您特别需要仅在重写与现有 PHP 文件匹配时跳过重写,那么:

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

如果请求为/subfolder1/<something>.php且该文件存在则在此停止。

更新#1:

我们只希望此操作适用于 /public_html 中的 PHP 文件,而不适用于其任何子文件夹

您可能仍可以在现有规则之前使用例外来执行此操作。如果请求包含斜线(即,它是针对子文件夹的),则中止。例如:

RewriteRule /.*/?$ - [L]

或者,将现有 s 中的模式更改RewriteRule为匹配除斜线之外的任何内容(即[^/]*),而不是字面上的所有内容(即.*)。应用于您现有的规则:

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

更新#2:向上述RewriteRule模式添加了锚点。

更新#3:要使上述操作仅适用于文档根目录中的特定文件。您可以使用例外(如上所示)来排除所有其他文件。例如:

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

为了允许所有 URL开始 /file1,,,等等(在每个目录的 .htaccess 文件中/file2,模式/file3匹配的 URLRewriteRule不以斜杠开头。)

在上下文中...

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]

相关内容