Чем больше знаю, тем лучше понимаю, как мало знаю.
Не сохранять URL в истории вы не сможете. Как и блокировать какие-бы то ни было расширения браузеров.
Но можно сделать по простому - при обычном обращении к странице ничего особенного не делать/не выводить. Но если обращение было с каким-нибудь особенным cookie (или значением в localStorage) - тогда отображать "секретное" содержимое. Тогда сколько не переходи на эту страницу без специального cookie - ничего не увидишь. А у этого cookie время жизни по минимуму, стирание при использовании, привязку к IP/браузеру/ещё чему-нибудь, да что угодно можно наворотить...
Чем больше знаю, тем лучше понимаю, как мало знаю.
Вы думаете не так. Таблица main ВСЕГДА должна применяться ПОСЛЕ любых других таблиц. Это как default route в этой самой main, применяется когда все другие route не совпали/не подошли. Соответственно требовать от main применения раньше какой-то другой таблицы - это ставить телегу впереди лошади. Точнее плуг впереди трактора. Точнее баржу впереди бурлаков, во!
Чем больше знаю, тем лучше понимаю, как мало знаю.
Не отвечаете header(), а сами в этом скрипте обращаетесь к этой ссылке, качаете её, и отдаёте скачанное запросившему пользователю. Так будет работать. Но для того скрипта на отдельном порту ВСЕ такие коннекты будут с IP-адреса самого сервера, что плохо для разграничения доступа...
Чем больше знаю, тем лучше понимаю, как мало знаю.
А вы тупо не видите свой же исходный код? И не замечате, что спам-бот присылает сообщения с пустыми $key, то есть нигде нет поля "Комментарий", из-за которого нужно бы блокировать? И поля "x" тоже ни одного нет. Есть только "E-mail" и "upfile". Не видите, что POST делается не со страницы с формой, а на прямую?
Чем больше знаю, тем лучше понимаю, как мало знаю.
Ну если автомобиль перевернуть вверх колёсами и поставить крышей на асфальт - он тоже не будет ездить. И с чего бы это вдруг? А нас ведь всё тот же автомобиль, он обязан ехать!
Так писать операцию сравнения нельзя. А в приведённом примере JavaScript сначала вычислит результат 604.5< -597.5 - получит false, который превратит в 0, потому что дальше ещё одна арифмитическая операция сравнения 0 < 512.5 - вот и получилось true. А второй пример написан правильно - и результат правильный.
P.S. Это не язык программирования выдаёт какую-то ошибочную дичь, нет. Это вы должны подстраивать свои хотелки под правила и логику языка программирования.
Чем больше знаю, тем лучше понимаю, как мало знаю.
Создаёте необходимое кол-во интерфейсов внутри этой виртуальк, и прибиваете к ним провайдерские IP. К vmbr0 ProxMox-а они сами присоединятся. Вот и всё.
Чем больше знаю, тем лучше понимаю, как мало знаю.
Скажите админам, что по умолчанию браузерами коннект делается на порт 80, HTTP.
Но если стои-и-иит плагииии-и-и-ин автоперевода на HTTPS, или сам сервер редиректит, или руками добавляешь S куда надо - вот тогда даааа, нате вам HTTPS. Но только тогда.
А по умолчанию, если набран просто домен - будет HTTP. Точка!
Чем больше знаю, тем лучше понимаю, как мало знаю.
Я вам подскажу: внутри TCP и UDP, если это не HTTP, нет имени домена. Вот совсем нет. Он используется в момент перевода доменного имени -> в IP-адрес, что бы потом создать коннект на этот IP-адрес. Он используется в HTTP-запросе, так исторически сложилось. Но в простом TCP и UDP его НЕТ, трафик приходит к вам БЕЗ доменного имени.
Чем больше знаю, тем лучше понимаю, как мало знаю.
Проще всего установить пакет lrzsz, и использовать команду sz filename.ext, конечно если ваш терминальный клиент поддерживает Z-Modem (или Y-Modem, или X-Modem).