Назад | Перейти на главную страницу

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, которые мы не хотим переписывать.

Как я могу изменить перезапись + завершающую косую черту, чтобы она применялась только к файлам 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]

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

ОБНОВЛЕНИЕ №1:

Мы хотим, чтобы это применялось только к файлам PHP в / public_html, а не к его подпапкам.

Вероятно, вы все еще можете сделать это за исключением существующих правил. Если запрос содержит косую черту (т. Е. Для подпапки), прервите его. Например:

RewriteRule /.*/?$ - [L]

В качестве альтернативы можно изменить узор в существующем RewriteRules для соответствия чему угодно, кроме косой черты (т. е. [^/]*) вместо буквально всего (т.е. .*). Применяется к вашим существующим правилам:

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]