В настоящее время я использую следующее в /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]
Это отлично работает, однако есть несколько файлов PHP в подпапках / public_html, который мы не хотим переписывать.
Как я могу изменить rewrite + завершающую косую черту, чтобы она применялась только к файлам PHP в папке / public_html, или, чтобы указать список файлов PHP, к которым применяется правило ?
ОБНОВЛЕНИЕ: В моем случае, я считаю, что оптимальным решением будет удаление расширения PHP (и добавление конечной косой черты) только к явно указанным файлам, а не создание условий на основе папки.
ОБНОВЛЕНИЕ 2: Рабочее решение:
#Remove PHP extension from named files
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(file1|file2)/?$ /$1.php [L,NC]
Вы можете просто сделать исключение в начале вашего файла .htaccess
... если запрос соответствует одной из этих подпапок ( и - существующий файл PHP?), затем остановите процесс перезаписи. Например:
RewriteRule ^(subfolder1|subfolder2)$ - [L]
Если вы просто хотите пропустить все запросы, вы можете на этом остановиться. Если вам нужно пропустить перезапись только в том случае, если он соответствует существующим файлам PHP, то:
RewriteCond %{REQUEST_FILENAME} -f
RewriteRule ^(subfolder1|subfolder2)/.+\.php$ - [L]
Если запрос if для / subfolder1 /
и этот файл существует, остановитесь здесь.
ОБНОВЛЕНИЕ №1:
Мы хотим, чтобы это применялось только к файлам PHP в / public_html, и ни к одной из его подпапок
Вы, вероятно, все еще могли бы сделать это с исключением перед вашими существующими правилами. Если запрос содержит косую черту (т. Е. Для подпапки), прервите его. Например:
RewriteRule /.*/?$ - [L]
В качестве альтернативы можно изменить шаблон в ваших существующих 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
, / file2
, / file3
и т. Д. (URL соответствует по шаблону RewriteRule
не начинается с косой черты в файлах .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]