Вопрос или проблема
Мне нужно включить allowEncodedSlashes на моем сервере Apache, но я не уверен, куда поместить это правило. Как упоминалось на этом форуме, я поместил его внутри VirtualHost в файлах php56.conf (для порта 80) и ssl.conf (порт 443), но, похоже, это ничего не даёт. Я также добавил allowEncodedSlashesNoDecode в httpd.conf, но это тоже не помогает.
Httpd.conf находится в etc/httpd/conf
# Это основной файл конфигурации сервера Apache HTTP. Он содержит
# директивы конфигурации, которые дают серверу его инструкции.
# См. <URL:http://httpd.apache.org/docs/2.4/> для получения подробной информации.
# В частности, см.
# <URL:http://httpd.apache.org/docs/2.4/mod/directives.html>
# для обсуждения каждой директивы конфигурации.
#
# См. страницу man httpd.conf(5) для получения более подробной информации о данной конфигурации,
# и httpd.service(8) по использованию и настройке службы httpd.
#
# Не просто читайте инструкции здесь, не понимая, что они делают. Они здесь только как подсказки или напоминания. Если вы не уверены, обратитесь к онлайн-документации. Вас предупредили.
#
# Имена конфигурационных файлов и файлов журналов: Если имена файлов, которые вы указываете для многих
# файлов управления сервером, начинаются с "/" (или "диск:/" для Win32), сервер будет использовать этот явный путь. Если имена файлов *не* начинаются
# с "/", значение ServerRoot будет добавлено в начало - так что 'log/access_log'
# с установленным ServerRoot на '/www' будет интерпретировано сервером как '/www/log/access_log', в то время как '/log/access_log' будет
# интерпретироваться как '/log/access_log'.
#
# ServerRoot: Вершина дерева каталогов, под которой хранятся файлы
# конфигурации, ошибки и журналы сервера.
#
# Не добавляйте слэш в конце пути к каталогу. Если вы указываете
# ServerRoot на не локальный диск, убедитесь, что вы указали локальный диск в директиве Mutex, если используются файловые мьютексы. Если вы хотите разделить
# один и тот же ServerRoot для нескольких демонов httpd, вам нужно будет изменить
# как минимум PidFile.
#
ServerRoot "/etc/httpd"
#
# Listen: Позволяет привязывать Apache к определённым IP-адресам и/или
# портам, вместо значения по умолчанию. См. также директиву <VirtualHost>.
#
# Измените это, чтобы прослушивать определённые IP-адреса, как показано ниже, чтобы
# предотвратить ненужное связывание Apache со всеми привязанными IP-адресами.
#
#Listen 12.34.56.78:80
#Listen 8080
#
# Поддержка динамических разделяемых объектов (DSO)
#
# Чтобы иметь возможность использовать функциональность модуля, который был собран как DSO,
# вы должны разместить соответствующие строки `LoadModule` в этом месте, чтобы
# директивы, содержащиеся в нём, были фактически доступны _до_ их использования.
# Статически скомпилированные модули (те, которые указаны командой `httpd -l`) не нужно
# загружать здесь.
#
# Пример:
# LoadModule foo_module modules/mod_foo.so
#
Include conf.modules.d/*.conf
# Если вы хотите, чтобы httpd работал от имени другого пользователя или группы, вам нужно запустить
# httpd как root первоначально, и он переключится.
#
# User/Group: Имя (или #номер) пользователя/группы, от имени которого будет работать httpd.
# Обычно хорошей практикой является создание специализированного пользователя и группы для
# работы httpd, как и для большинства системных служб.
#
User apache
Group apache
# 'Основная' конфигурация сервера
#
# Директивы в этом разделе устанавливают значения, используемые 'основным'
# сервером, который отвечает на любые запросы, которые не обрабатываются
# определением <VirtualHost>. Эти значения также задают значения по умолчанию для
# любых контейнеров <VirtualHost>, которые вы можете определить позже в файле.
#
# Все эти директивы могут появляться внутри контейнеров <VirtualHost>,
# в таком случае эти настройки по умолчанию будут переопределены для
# определяемого виртуального хоста.
#
#
# ServerAdmin: Ваш адрес, на который должны быть отправлены проблемы с сервером.
# Этот адрес появляется на некоторых страницах, сгенерированных сервером, таких
# как документы об ошибках. Например, [email protected]
#
ServerAdmin root@localhost
#
# ServerName даёт имя и порт, которые сервер использует для идентификации себя.
# Это часто может быть определено автоматически, но мы рекомендуем явно
# указывать его, чтобы избежать проблем во время запуска.
#
# Если у вашего хоста нет зарегистрированного DNS-имени, введите здесь его IP-адрес.
#
#ServerName www.example.com:8080
#
# Запретить доступ ко всему файловой системе вашего сервера. Вы должны
# явно разрешить доступ к веб-контенту в других
# блоках <Directory> ниже.
#
<Directory />
AllowOverride none
Require all granted
</Directory>
#
# Обратите внимание, что с этого момента вам необходимо явно разрешить
# отдельные функции - так что если что-то не работает, как вы могли ожидать, убедитесь,
# что вы явно разрешили это ниже.
#
#
# DocumentRoot: каталог, из которого будут предоставляться
# ваши документы. По умолчанию все запросы принимаются из этого каталога, но
# могут использоваться символические ссылки и псевдонимы для указания на другие местоположения.
#
DocumentRoot "/var/www/html"
#
# Расслабить доступ к контенту внутри /var/www.
#
<Directory "/var/www">
AllowOverride None
# Позволить открытый доступ:
Require all granted
</Directory>
# Дополнительно расслабить доступ к каталогу по умолчанию:
<Directory "/var/www/html">
#
# Возможные значения для директивы Options: "None", "All",
# или любая комбинация из:
# Indexes Includes FollowSymLinks SymLinksifOwnerMatch ExecCGI MultiViews
#
# Обратите внимание, что "MultiViews" должно быть указано *явно* --- "Options All"
# не даст вам его.
#
# Директива Options одновременно сложная и важная. Пожалуйста, смотрите
# http://httpd.apache.org/docs/2.4/mod/core.html#options
# для получения более подробной информации.
#
Options Indexes FollowSymLinks
#
# AllowOverride управляет тем, какие директивы могут быть указаны в файлах .htaccess.
# Это может быть "All", "None", или любая комбинация ключевых слов:
# Options FileInfo AuthConfig Limit
#
AllowOverride All
#
# Управляет тем, кто может получать информацию с этого сервера.
#
Require all granted
</Directory>
#
# DirectoryIndex: задает файл, который Apache будет обслуживать, если каталог
# запрашивается.
#
<IfModule dir_module>
DirectoryIndex index.html
</IfModule>
#
# Следующие строки предотвращают просмотр файлов .htaccess и .htpasswd
# веб-клиентами.
#
<Files ".ht*">
Require all denied
</Files>
#
# ErrorLog: Место нахождения файла журнала ошибок.
# Если вы не укажете директиву ErrorLog внутри контейнера <VirtualHost>,
# сообщения об ошибках, относящиеся к этому виртуальному хосту, будут
# записаны здесь. Если вы *определите* файл журнала ошибок для контейнера <VirtualHost>,
# ошибки этого хоста будут записаны там и не здесь.
#
ErrorLog "logs/error_log"
#
# LogLevel: Управляет количеством сообщений, записываемых в error_log.
# Возможные значения включают: debug, info, notice, warn, error, crit,
# alert, emerg.
#
LogLevel warn
<IfModule log_config_module>
#
# Следующие директивы определяют некоторые форматы псевдонимов для использования с
# директивой CustomLog (см. ниже).
#
LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
LogFormat "%h %l %u %t \"%r\" %>s %b" common
<IfModule logio_module>
# Вам нужно включить mod_logio.c, чтобы использовать %I и %O
LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\" %I %O" combinedio
</IfModule>
#
# Место нахождения и формат файла журнала доступа (Формат общего журнала).
# Если вы не определяете файлы журналов доступа внутри контейнера <VirtualHost>,
# они будут записаны здесь. Напротив, если вы *определите*
# файлы журналов доступа для каждого <VirtualHost>, транзакции будут
# записаны там, а *не* в этом файле.
#
#CustomLog "logs/access_log" common
#
# Если вы предпочитаете журнал с информацией о доступе, агенте и реферере
# (Формат общего журнала), вы можете использовать следующую директиву.
#
CustomLog "logs/access_log" combined
</IfModule>
<IfModule mpm_profork_module>
StartServers 5
MinSpareServers 5
MaxSpareServers 10
MaxRequestWorkers 5000
MaxConnectionsPerChild 0
</IfModule>
<IfModule alias_module>
#
# Redirect: Позволяет вам уведомить клиентов о документах, которые раньше
# существовали в пространстве имен вашего сервера, но теперь не существуют. Клиент
# сделает новый запрос на документ по его новому местоположению.
# Пример:
# Redirect permanent /foo http://www.example.com/bar
#
# Alias: Отображает веб-пути в пути файловой системы и используется для
# доступа к контенту, который не находится под DocumentRoot.
# Пример:
# Alias /webpath /full/filesystem/path
#
# Если вы добавите слэш в конце /webpath, сервер будет
# требовать его присутствия в URL. Вам также, вероятно,
# потребуется предоставить блок <Directory>, чтобы разрешить доступ к
# пути файловой системы.
#
# ScriptAlias: Это управляет тем, какие директории содержат серверные скрипты.
# ScriptAliases по сути такие же, как Aliases, за исключением того, что
# документы в целевой директории обрабатываются как приложения и
# выполняются сервером при запросе, а не как документы, отправляемые клиенту. Те же правила о слэше в конце действуют на директивы ScriptAlias, как и на Alias.
#
ScriptAlias /cgi-bin/ "/var/www/cgi-bin/"
</IfModule>
#
# "/var/www/cgi-bin" должно быть изменено на то, где находится ваш ScriptAliased
# CGI-каталог, если вы это настроили.
#
<Directory "/var/www/cgi-bin">
AllowOverride None
Options None
Require all granted
</Directory>
<IfModule mime_module>
#
# TypesConfig указывает на файл, содержащий список соответствий от
# расширения имени файла к MIME-типу.
#
TypesConfig /etc/mime.types
#
# AddType позволяет вам добавлять или переопределять файл конфигурации MIME,
# указанный в TypesConfig для конкретных типов файлов.
#
#AddType application/x-gzip .tgz
#
# AddEncoding позволяет некоторым браузерам распаковывать
# информацию на лету. Обратите внимание: не все браузеры это поддерживают.
#
#AddEncoding x-compress .Z
#AddEncoding x-gzip .gz .tgz
#
# Если директивы AddEncoding, указанные выше, закомментированы, то вы
# вероятно должны определить эти расширения, чтобы указать медиа-типы:
#
AddType application/x-compress .Z
AddType application/x-gzip .gz .tgz
#
# AddHandler позволяет вам сопоставлять определённые расширения файлов с "обработчиками":
# действиями, не связанными с типом файла. Эти обработчики могут быть встроены в сервер
# или добавлены с помощью директивы Action (см. ниже)
#
# Чтобы использовать CGI-скрипты вне ScriptAliased директорий:
# (Вам также нужно будет добавить "ExecCGI" к директиве "Options".)
#
#AddHandler cgi-script .cgi
# Для типовых карт (переговорные ресурсы):
#AddHandler type-map var
#
# Фильтры позволяют вам обрабатывать содержимое перед его отправкой клиенту.
#
# Чтобы разобрать .shtml файлы для включений на стороне сервера (SSI):
# (Вам также нужно будет добавить "Includes" к директиве "Options".)
#
AddType text/html .shtml
AddOutputFilter INCLUDES .shtml
</IfModule>
#
# Укажите кодировку по умолчанию для всего контента; это позволяет
# интерпретировать весь контент как UTF-8 по умолчанию. Чтобы использовать
# выбор браузера по умолчанию (ISO-8859-1), или чтобы позволить META-тегам
# в HTML-контенте переопределить этот выбор, закомментируйте эту
# директиву:
#
AddDefaultCharset UTF-8
<IfModule mime_magic_module>
#
# Модуль mod_mime_magic позволяет серверу использовать различные подсказки из
# содержимого файла, чтобы определить его тип. Директива MIMEMagicFile
# говорит модулю, где расположены определения подсказок.
#
MIMEMagicFile conf/magic
</IfModule>
#
# Настраиваемые ответы на ошибки имеют три типа:
# 1) простой текст 2) местные перенаправления 3) внешние перенаправления
#
# Некоторые примеры:
#ErrorDocument 500 "Сервер совершил ошибку."
#ErrorDocument 404 /missing.html
#ErrorDocument 404 "/cgi-bin/missing_handler.pl"
#ErrorDocument 402 http://www.example.com/subscription_info.html
#
#
# EnableMMAP и EnableSendfile: На системах, которые поддерживают это,
# может использоваться отображение памяти или вызов системного вызова sendfile
# для доставки файлов. Это обычно улучшает производительность сервера, но
# должно быть отключено при обслуживании из сетевых файловых систем
# или если поддержка этих функций в частности нарушена на вашей системе.
# По умолчанию, если комментарий: EnableMMAP On, EnableSendfile Off
#
#EnableMMAP off
EnableSendfile on
AllowEncodedSlashes NoDecode
# Дополнительная конфигурация
#
# Загрузить файлы конфигурации из директории "/etc/httpd/conf.d", если таковые имеются.
IncludeOptional conf.d/*.conf
php5.6.conf в etc/httpd/conf.d
Listen 80
<VirtualHost *:80>
ServerAdmin oshima_admin@localhost
ServerName www.oshima.com.tw
DocumentRoot "/var/www/html/Oshima_WEB"
Redirect permanent / https://oshima.com.tw
TimeOut 30
# Включите модули mod_proxy и mod_rewrite
#LoadModule proxy_module modules/mod_proxy.so
#LoadModule proxy_http_module modules/mod_proxy_httpd.so
#LoadModule rewrite_module modules/mod_rewrite.so
# Включите обратный прокси
ProxyRequests Off
# Отображение на целевой сервер
#ProxyPass /product/fabricspreadingmachine/J3 https://www.oshima.com.tw/product_d.php?lang=en&tb=1&id=2968
ErrorLog "/var/log/httpd/rewrite_log"
LogLevel error rewrite:trace3
AllowEncodedSlashes NoDecode
<IfModule mpm_profork_module>
StartServers 5
MinSpareServers 5
MaxSpareServers 10
MaxRequestWorkers 1500
MaxConnectionsPerChild 0
</IfModule>
<FilesMatch "\.php$">
<If "-f %{REQUEST_FILENAME}">
SetHandler "proxy:unix:/var/opt/remi/php56/run/php-fpm/www.sock|fcgi://localhost"
</If>
</FilesMatch>
ScriptAlias /cgi-bin/ "/var/www/cgi-bin/"
AddHandler php56-fcgi .php
Action php56-fcgi /cgi-bin/php56.fcgi
<Directory "/var/www/html/Oshima_WEB">
AllowOverride All
</Directory>
</VirtualHost>
`''
Не хватает ли мне конфигурационного файла, который конкретно занимается этим?
Изучите документацию Apache. Начните с AllowEncodedSlashes
. В ней есть запись, говорящая Контекст: конфигурация сервера, виртуальный хост
Если вы кликните по метке Контекст, вы попадете на страницу, объясняющую, что это означает:
- конфигурация сервера
Это означает, что директива может использоваться в конфигурационных файлах сервера (например, httpd.conf), но не внутри контейнеров <Directory> или <Location>. Она совсем не допускается в файлах .htaccess.- виртуальный хост
Этот контекст означает, что директива может появляться внутри контейнеров <VirtualHost> в конфигурационных файлах сервера.
Таким образом, вы можете включить AllowEncodedSlashes
глобально или в конфигурации vhost.
Ответ или решение
Чтобы включить параметр AllowEncodedSlashes
на вашем сервере Apache под управлением Ubuntu, вам следует убедиться, что вы настраиваете этот параметр правильно, учитывая, что директива может быть использована как в конфигурации сервера, так и в конфигурации виртуального хоста.
Шаги для включения AllowEncodedSlashes
-
Открытие конфигурационных файлов:
Убедитесь, что у вас есть доступ к необходимым файлам конфигурации. В большинстве случаев конфигурационные файлы Apache находятся в/etc/apache2/sites-available/
, а для специфических версий PHP, таких как php56, в/etc/httpd/conf.d/
или аналогичных. -
Редактирование файла конфигурации виртуального хоста:
Вам необходимо добавить директивуAllowEncodedSlashes
в соответствующий файл конфигурации виртуального хоста. Например, если вы редактируете файлphp56.conf
, он может выглядеть следующим образом:<VirtualHost *:80> ServerAdmin oshima_admin@localhost ServerName www.oshima.com.tw DocumentRoot "/var/www/html/Oshima_WEB" Redirect permanent / https://oshima.com.tw TimeOut 30 AllowEncodedSlashes NoDecode <Directory "/var/www/html/Oshima_WEB"> AllowOverride All </Directory> # Другие настройки... </VirtualHost>
Убедитесь, что директива
AllowEncodedSlashes NoDecode
находится внутри блока<VirtualHost>
. -
Редактирование конфигурации для HTTPS:
Если вы используете SSL, убедитесь, что аналогичная директива добавлена и в файл конфигурацииssl.conf
(или другой файл конфигурации, отвечающий за HTTPS):<VirtualHost *:443> ServerAdmin oshima_admin@localhost ServerName www.oshima.com.tw DocumentRoot "/var/www/html/Oshima_WEB" AllowEncodedSlashes NoDecode # Другие настройки для HTTPS... </VirtualHost>
-
Проверка использования директивы в файлах .htaccess:
Помните, чтоAllowEncodedSlashes
нельзя использовать в файлах.htaccess
; этот параметр должен быть определен в основном конфигурационном файле или в блоке виртуального хоста. -
Проверка конфигурации Apache:
После внесения изменений в конфигурацию, проверьте, все ли настроено правильно, запустив следующую команду:sudo apachectl configtest
Если появится сообщение
Syntax OK
, это означает, что конфигурация корректна. -
Перезапуск Apache:
Для применения всех изменений выполните команду:sudo systemctl restart apache2
или, в зависимости от вашего дистрибутива:
sudo systemctl restart httpd
-
Тестирование работы:
Проверьте, корректно ли работает ваш сервер, используя закодированные символы в URL, чтобы убедиться, что они обрабатываются как ожидалось.
В случае, если после выполнения всех шагов проблема все еще не решена, возможно, есть другие настройки или модули, блокирующие корректную работу данной директивы. В таких случаях рекомендуется изучить логи Apache на наличие ошибок, которые могут дать больше информации о проблеме.