我目前在/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]