В настоящее время я использую следующее в /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]
В качестве альтернативы можно изменить узор в существующем RewriteRule
s для соответствия чему угодно, кроме косой черты (т. е. [^/]*
) вместо буквально всего (т.е. .*
). Применяется к вашим существующим правилам:
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]