Измените рабочий AddHandler, чтобы он соответствовал файлам только в ТЕКУЩЕМ каталоге, а НЕ в дочерних каталогах.

Следующее отлично работает для разрешения выполнения PHP в двух XML-файлах:

<FilesMatch ^(opensearch|sitemap)\.xml$>
AddHandler application/x-httpd-php5 .xml
</FilesMatch>

Однако к сожалению, это правило позволяет делать это и в любом дочернем каталоге.

  • /opensearch.xml, рабочее/нужное совпадение
  • /henchman24/opensearch.xml, работает/НЕ нужное соответствие

Как заставить Apache только сопоставлять файлы в текущем каталоге, а не в дочерних каталогах?

Я бы очень хотел:

  • Избегайте добавления дочернего файла .htaccess во все возможные дочерние каталоги.
  • Избегайте использования абсолютного пути к серверу.

person John    schedule 08.04.2020    source источник
comment
Вы можете попробовать изменить регулярное выражение в FilesMatch, чтобы оно соответствовало только корневому каталогу: stackoverflow.com/questions/4899419/   -  person Katie    schedule 13.04.2020


Ответы (2)


If директива может использоваться для предоставления условие добавления обработчика только для файлов, соответствующих шаблону в текущей папке.

В следующем примере обработчик будет добавлен только для файлов в корне документа, таких как /sitemap.xml и /opensearch.xml, но не для /folder/sitemap.xml и /folder/opensearch.xml.

<FilesMatch ^(opensearch|sitemap)\.xml$>
<If "%{REQUEST_URI} =~ m#^\/(opensearch|sitemap)\.xml$#">
  AddHandler application/x-httpd-php .xml
</If>
</FilesMatch>

В приведенном выше примере условие проверяет соответствие REQUEST_URI шаблону регулярного выражения с разделителями в m# #. ~= оператор сравнения проверяет соответствие строки регулярному выражению.

Шаблон ^\/(opensearch|sitemap)\.xml$ соответствует REQUEST_URI переменной (компонент пути запрошенного URI ), например /opensearch.xml или /sitemap.xml

^                      # startwith
\/                     # escaped forward-slash
(opensearch|sitemap)   # "opensearch" or "sitemap"
\.                     # .
xml                    # xml
$                      # endwith
person Oluwafemi Sule    schedule 10.04.2020
comment
Интересно, что это повредило файл .htaccess, и мне пришлось его удалить, и я не уверен, что не так с битом Directory? - person John; 10.04.2020
comment
Может быть, это будет работать в Apache 2.2? Я использую Apache 2.4. Я знаю, что есть некоторые изменения в том, как работает синтаксис. Я должен был уточнить версию Apache с самого начала, приношу свои извинения. - person John; 12.04.2020
comment
@ковенер. Шаблон, используемый в этом примере, основан на общей конфигурации в вопросе ОП. Если нужно сопоставить определенные каталоги, нужно явно указать это в шаблоне. - person Oluwafemi Sule; 13.04.2020
comment
@John Директива Directory не поддерживается в контексте файла .htaccess. Рассматривали ли вы использование директивы If для ограничения установки обработчика в папке, содержащей файл .htaccess? - person Oluwafemi Sule; 13.04.2020
comment
Это сработало! Принято и проголосовано. Я протестировал другую копию того же файла в другом каталоге. Не могли бы вы пояснить, что конкретно делает условие If? - person John; 13.04.2020
comment
Кулио. Я отредактировал ответ, чтобы объяснить, что делает условие If. - person Oluwafemi Sule; 13.04.2020
comment
Удалил мой предыдущий комментарий, так как ответ резко изменился - person covener; 14.04.2020

Вы пробовали H= в RewriteRule?

RewriteEngine On
RewriteRule ^(opensearch|sitemap)\.xml$ . [H=application/x-httpd-php5]

Rewrite в htaccess имеет встроенное свойство, заключающееся в том, что эти имена файлов в любом подкаталоге будут иметь подкаталог, присутствующий в строке, против которой проверяется регулярное выражение, поэтому привязанное регулярное выражение не будет совпадать в подкаталогах.

person covener    schedule 12.04.2020
comment
К сожалению, это не то место, где мы можем реализовать suPHP. Это может быть год или два, хотя в конце концов я могу обнаружить, что это правильный ответ. Поскольку его нельзя протестировать, я, к сожалению, пока не могу хотя бы проголосовать за него. - person John; 12.04.2020
comment
Я понятия не имею, какое отношение ответ имеет к suPHP, если только ваша цель неявно касалась suPHP. - person covener; 12.04.2020
comment
Not Supported — это сообщение об ошибке Apache, появившееся после использования этого правила. При дальнейшем расследовании выяснилось, что это как-то связано с PHP (cgi по сравнению с suPHP). Я не уверен, почему, хотя, не моя область знаний. - person John; 12.04.2020