SSI - проверить, существует ли файл - PullRequest
2 голосов
/ 08 марта 2011

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

if /file/testthisfile.ssi exists
    add /file/testthisfile.ssi
else
    add /file/default.ssi

Возможно ли это?

Спасибо!

Ответы [ 5 ]

4 голосов
/ 08 марта 2011

Нет - я боялся этого ответа.Но для любого, кто может столкнуться с этим вопросом в будущем, я нашел способ обойти простые случаи.Вы можете отредактировать сообщение об ошибке и в моем случае вывести изображение:

<!--#config errmsg="<img src='/file/testthisfile.jpg' alt='' />" -->

Так что если файл не существует, вы можете установить значение по умолчанию.

Необходимо подчеркнуть, что это будет работать только для простых случаев, но это небольшой приятный обходной путь!

3 голосов
/ 07 декабря 2012

На самом деле, вопреки ответам, SSI фактически поддерживает тесты на существование файлов.это синтаксис

<!--#if expr="-A /private" -->
  Click <a href="/private">here</a> to access private information.
<!--#endif -->

Возможно, необходимо включить поддержку флага -A в конфигурации apache.

Выражения, используемые в этом месте SSI, были преобразованы в apacheМодуль выражений, описанный здесь

http://httpd.apache.org/docs/current/expr.html

, но флаг -A также доступен в "старых" парсерах выражений SSI.

0 голосов
/ 04 января 2019

Если вы используете Apache 2.4, вы можете использовать опцию -F (обратите внимание на цитирование).

<!--#if expr='-F "/private"' -->
  Click <a href="/private">here</a> to access private information.
<!--#endif -->

Из документов (http://httpd.apache.org/docs/current/expr.html):

True, если строка является допустимым файлом, доступным через все настроенные в настоящее время серверные элементы управления доступом для этого пути. При этом используетсявнутренний подзапрос, чтобы выполнить проверку, поэтому используйте его осторожно - это может повлиять на производительность вашего сервера!

Для примера работы пользователю Apache потребуется доступ к директории / тестируемому вами флагу.Вам также может понадобиться следующее в файле .htaccess или httpd.conf:

<Directory /private>
Require all granted
</Directory>
0 голосов
/ 08 марта 2011

Я думал об этом некоторое время, и, действительно, аххудо было правильно, SSI не имеет встроенной функции обнаружения файлов, поэтому управление потоком ограничено.

В качестве отступления я нашелссылка на расширенную версию SSI (системы на основе VMS)

http://wasd.vsm.com.au/doc/env/env_0400.html

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

Однако чаще, чем нет, если бы вы использовали SSI, он, вероятно, работал бы в среде LAMP, поэтому можно было бы воспользоваться возможностью SSI запускать скрипт CGI / PHP в операторе включения.

Без особых проблем можно прибегнуть к:

<body> 
<!--#include virtual="insert_intro.html" -->
<h2>Insert An Existing File</h2>
<!--#include 
virtual='checkFileExists.php?fn=insert_help.html&df=insert_default.html' -->
<h2>Insert a Non-Existing File</h2>
<!--#include 
virtual='checkFileExists.php?fn=insert_no_help.html&df=insert_default.html' -->
</body>

, который использует PHP-скрипт для выполнения всей проверки файлов:

<?php
$theFileName = $_GET['fn'];
$theDefault  = $_GET['df'];
if ( file_exists($theFileName) === TRUE ) {
    include($theFileName);
} else {
    include($theDefault);
}
?>

Я передаю два имени файла,предполагаемый файл и файл резервной копии / файла по умолчанию, скрипт проверяет первый и, если он не найден, использует второй.

При таком подходе возникает вопрос: зачем использовать SSI, когда доступен PHP?В некоторых случаях, особенно в устаревшей системе, может существовать большой веб-сайт, основанный на SSI, и обходной путь, хотя и менее изящный, решит проблему.

PHP не является обязательным, сценарий PERL также будетработа.

Наконец, я попытался использовать PHP apache_setenv, но не смог понять, как передавать переменные окружения между PHP, Apache и SSI (я также пытался установить переменные $ _SERVER и $ _ENV, нобез успеха).

0 голосов
/ 08 марта 2011

SSI не поддерживает обнаружение файлов.

...