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]

Это отлично работает, однако есть несколько файлов 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]
2
задан 26 September 2016 в 20:16
1 ответ

Вы можете просто сделать исключение в начале вашего файла .htaccess ... если запрос соответствует одной из этих подпапок ( и - существующий файл PHP?), затем остановите процесс перезаписи. Например:

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

Если вы просто хотите пропустить все запросы, вы можете на этом остановиться. Если вам нужно пропустить перезапись только в том случае, если он соответствует существующим файлам PHP, то:

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

Если запрос if для / subfolder1 / .php и этот файл существует, остановитесь здесь.

ОБНОВЛЕНИЕ №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]
1
ответ дан 3 December 2019 в 12:38

Теги

Похожие вопросы