Я использую прослушивание HAProxy на 80 для отправки запросов на сервер узла (порт: 3000) или сервер php (4000); У меня также установлен CSF с портами 3000 и 80.
Это работает хорошо, когда я просматриваю страницу в http://example.com/forum/1/page.php
, но иногда, когда я случайно захожу example.com/forum/1
(без косой черты), он продолжает загружаться и в конечном итоге приводит к ошибке страницы ERR_CONNECTION_TIMED_OUT
, Адресная строка показывает, что она перенаправлена на http://example.com:4000/forum/1/
,
Так как у меня нет 4000 открытого порта, когда я продолжаю example.com/forum/1
несколько раз это вызовет блокировку CSF. У меня вопрос, могу ли я перенаправить все запросы, которые указывают на фактическую папку example.com/forum/1
(без косой черты) на страницу 404? Я попытался добавить правило перезаписи, чтобы добавить косую черту к каждому запросу, но это сломало бы все мои относительные пути (см. Мою проблему в этом сообщение).
Так что я хочу знать, почему я был перенаправлен на http://example.com:4000/forum/1/
от http://example.com/forum/1
? Это было вызвано HAproxy?
Некоторые настройки HAproxy:
frontend all 0.0.0.0:80
timeout client 1h
# use apache2 as default webserver for incoming traffic
default_backend apache2
backend apache2
balance roundrobin
option forwardfor
server apache2 myIpAddress:4000 weight 1 maxconn 1024 check
# server must be contacted within 5 seconds
timeout connect 5s
# all headers must arrive within 3 seconds
timeout http-request 3s
# server must respond within 25 seconds. should equal client timeout
timeout server 25s
Вот мои правила переписывания:
RewriteCond %{REQUEST_FILENAME} -d [OR]
RewriteCond %{REQUEST_FILENAME} -f [OR]
RewriteCond %{REQUEST_FILENAME} -l
RewriteRule ^ - [L]
RewriteCond %{REQUEST_URI} !^.*\.(jpg|css|js|gif|png)$ [NC]
RewriteCond %{REQUEST_FILENAME}.php -f
RewriteRule !.*\.php$ %{REQUEST_FILENAME}.php [QSA,L]
RewriteCond %{THE_REQUEST} /index\.php [NC]
RewriteRule ^([^\.]+)$ $1.php [NC,L]
поскольку /forum/1
является действительным физическим каталогом, на который вы перенаправлены /forum/1/
из-за этой настройки:
DirectorySlash On
который используется модулем под названием mod_dir
это добавляет косую черту после каталогов, если оно отсутствует.
Конечно, вы можете отключить этот флаг, используя:
DirectorySlash Off
но знать о последствиях для безопасности.
Для большей безопасности вам также необходимо:
Options -Indexes
отключить список каталогов.
Предупреждение безопасности (скопировано из связанного руководства)
Отключение перенаправления косой черты может привести к раскрытию информации. Рассмотрим ситуацию, когда mod_autoindex
активен (Options +Indexes
) а также DirectoryIndex
установлен в допустимый ресурс (скажем, index.html), и нет другого специального обработчика, определенного для этого URL. В этом случае запрос с косой чертой будет показывать index.html
файл. Но запрос без завершающего слеша будет содержать список содержимого каталога.
Обновить: Чтобы ответить на эту часть вопроса:
У меня вопрос, могу ли я перенаправить все запросы, которые указывают на фактическую папку
example.com/forum/1
(без косой черты) на страницу 404?
Вы можете использовать этот код в /forum/1/.htaccess
:
DirectorySlash On
RewriteEngine On
RewriteRule ^$ - [L,R=404]
Это вызовет косую черту, так что правило перезаписи может использоваться для отправки ошибки 404.
В вашем файле .htaccess добавьте следующий код. Замените /404.php любым файлом, который вы хотите.
ErrorDocument 404 /404.php
Поместите это в верхней части вашего .htaccess
DirectorySlash Off
RewriteOptions AllowNoSlash
RewriteEngine On
RewriteCond ${REQUEST_FILENAME} -d
RewriteRule ^(.*[^/])$ - [L,R=404]
Выключение DirectorySlash сделает каталоги доступными без косой черты без перенаправления.
Но проблема заключается в том, что версия без слеша просто перечислит содержимое каталога.
Я приказываю избежать этого, RewriteOptions AllownoSlash добавлен.
Теперь, когда папка запрашивается без косой черты, возникает ошибка 404.