Как перенаправить на 404, когда URL-адрес указывает на существующую папку (без косой черты). HAproxy или mod-rewrite, связанный

Я использую прослушивание 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]

10

Решение

поскольку /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.

3

Другие решения

В вашем файле .htaccess добавьте следующий код. Замените /404.php любым файлом, который вы хотите.

ErrorDocument 404 /404.php
2

Поместите это в верхней части вашего .htaccess

DirectorySlash Off
RewriteOptions AllowNoSlash
RewriteEngine On
RewriteCond ${REQUEST_FILENAME} -d
RewriteRule ^(.*[^/])$ - [L,R=404]

Выключение DirectorySlash сделает каталоги доступными без косой черты без перенаправления.

Но проблема заключается в том, что версия без слеша просто перечислит содержимое каталога.
Я приказываю избежать этого, RewriteOptions AllownoSlash добавлен.

Теперь, когда папка запрашивается без косой черты, возникает ошибка 404.

1
По вопросам рекламы [email protected]