PHP IP Addresse des Servers darstellen

D708

Commander
Registriert
Juli 2015
Beiträge
2.439
Hi liebe PHP Profis,
Ich habe einen Webserver erstellt für eine grafische Darstellung eines Produktionsprozesses. Das läuft auch alles tadellos. Der Webserver läuft auf einem RaspPi 3 und ist per WLAN angeschlossen.
An dem Raspberry befindet sich ein Touchdisplay, mit dem Eingaben möglich sind, aber eher nur so lala. Die eigentliche Eingabemethode ist per externen Browser.

Jetzt startet der RaspPi im Kioskmodus auf der Seite als Localhost, aber wie kann ich dem Anwender klar machen, wie er den Webserver erreicht?

Meine Überlegung war, die ServerIP auf der Startseite darzustellen, damit der Anwender die bei sich eingeben kann. Aber da fangen die Probleme an.
Entweder ich setze eine Static Addresse ein und damit kann ich das Teil nur noch in meinem Netzwerk vernünftig verwenden, oder ich nutze „localhost“, aber dann kommt bei $_Server auch nur „localhost“ oder „127.0.0.1“ oder „::1“ rum. Ist ja auch Logo.

Jetzt habe ich mehrere Weg ausprobiert(mehr schlecht als recht). Aber nichts gefunden.

Meine letzte Knüppelmethodik wäre mit Python die IP auslesen, in die Datenbank oder ähnliches und dann mit PHP auslesen. Ist aber irgendwie nicht sehr elegant. Oder mit PHP das Pythonscript direkt ausführen.
 
D708 schrieb:
Meine Überlegung war, die ServerIP auf der Startseite darzustellen

hää aber dazu muss er doch erstmal auf der Website sein, oder nicht...? Und wenn die nur local erreichbar, kann sich die doch eh keiner angucken...

Sorry, aber iwie begreif ich dein Problem noch nich ganz... Du hast also eine Website (bzw. Anwendung), die auf dem Pi läuft und da sollen Anwender drauf zugreifen. Vorher müssen die aber die IP kennen....?! Und dein Problem ist jetzt, wie du den Anwendern diese sich regelmäßig ändernde IP mitteilen kannst, korrekt?
 
Dein Problem wirst du mit DynDNS lösen können, sofern der Raspi auch von außerhalb erreichbar sein sollte.

Und wenn es nur im eigenen Netzwerk sein soll, kannst ja eine fixe IP vergeben und fertig.

Aber ganz blick ich bei deinen Angaben auch nicht durch.
 
Naja folgendes,
Auf dem RaspPI läuft ein Webserver. Auf diesem Webserver greift der Raspberry per Autostart(Kioskmodus) selber zu und startet die Seite Index.php.
Auf dieser Seite wird aktuell mit dem PHP Befehl $_Server(„http_host“) die IP Addresse angezeigt. In meinem Netzwerk habe ich dem PI eine feste Addresse gegeben.

Also beim Autostart steht drin, starte Chromium im Kioskmodus mit der Seite http://192.168.0.123. Dann startet die Seite und auf dem Touchscreen steht dann „geben Sie in Ihrem Browser diese IP Addresse ein“.
In einem anderen Netzwerk kommt nur Schrott bei rum. Da kann ich nur, um sicher zu gehen, das die Autostartseite auf „Localhost“ stellen. Dann steht aber auf dem Touchscreen „localhost“, was dem Anwender nicht hilft.

Bin echt schlecht im Erklären. Ist wohl auch der Grund, warum mir Google so garnicht helfen kann.

Das folgende Problem ist mit der static IP, bekomme ich in anderen Netzwerken sofort Probleme.

Der RaspPI ist über außerhalb theoretisch erreichbar. Im Moment meldet der sich auch auf einem anderen Server in meinem Besitz per VPN an und ist dann vom diesem aus erreichbar. (RaspPI und Server sind nicht im gleichen Netzwerk)

Es geht darum, dass der Anwender beim Starten der Anlage (RaspPI und Microcontroller) sofort weiß, wie er drauf zugreifen kann. Theoretisch soll das Ganze auch ohne Internet funktionieren.
 
Zuletzt bearbeitet:
Beantworte mir jetzt kurz mal ne Frage - was willst du mit deinem Projekt erreichen? vlt. verstehe ich es dann besser.

Und sollte der Raspi nur in deinem Netzwerk erreichbar sein oder? und die Anwender sind ja ebenfalls in diesen Netzwerk oder?
 
DonConto schrieb:
Was liefert denn:

<?php
echo $_SERVER['SERVER_ADDR'];
?>
::1. Die IP v6 des Servers. Das nutzt dem Anwender Garnichts.
Ergänzung ()

cm87 schrieb:
Beantworte mir jetzt kurz mal ne Frage - was willst du mit deinem Projekt erreichen? vlt. verstehe ich es dann besser.

Und sollte der Raspi nur in deinem Netzwerk erreichbar sein oder? und die Anwender sind ja ebenfalls in diesen Netzwerk oder?
Es geht um eine Automatisierung einer Brauanlage. Die Software soll im Besten Fall auch von Anderen genutzt werden. Die Meisten, die selber Bierbrauen, sind häufig Software technisch dürftig aufgestellt. Daher traue ich ihnen nicht zu im Router nachzusehen, welche IP der Raspi hat.

Für Anwender des jetzigen Prototypes stellen sich keine Probleme. Die Anlage kann ich persönlich auf das vorhandene Netzwerk einstellen mit einer statischen IP Addresse.
Aber falls die Anlage das Netzwerk wechseln sollte und per Ethernet angeschlossen wird, habe ich den Salat. Entweder hat die Anlage dann eine statische IP Addresse und arbeitet autark ohne Internet
oder
per localhost öffnet sich zumindestens die Seite auf dem Touchscreen (Aber die Aussage" Sie erreichen den Webserver unter localhost" ist dann nicht zielführend)
Es geht nur um die LAN Verfügbarkeit in fremden Netzwerken.
 
Zuletzt bearbeitet:
Die vom PI genutzte IP zu erimitteln ist nicht besonders schwer. Problematisch wird es, wenn der PI im Oeffentlichen Netz, erreichbar sein soll

Wenn im Oeffentlichen Netz, dann wird die IP deines Routers benoetigt, da die IP des RPis gekapselt wird. Wenn ein DNS Service wie DynDNS genutzt wird, kannst du dir das auslesen sparen und die Domain direkt eintragen.

Wenn du im PHP die Adresse ausliest, mit der angefragt wurde, kannst du dir das ganze sparen, da der Nutzer damit bereits die Adresse kennt. Wenn der monitor "irgendwo" steht und jemand z. B. den Support kontaktiert und die Adresse ausgeben soll, dann bieten sich VPNs an, da sonst das andere Netz die Anfrage entsprechedn Mappen muss
Kurz: Es waere sehr schoen, wenn du deinen Usecase etwas genauer beschreibst, wie @cm87 bereits gefragt hat.

D708 schrieb:
::1. Die IP v6 des Servers.
Das ist die Loopback. wie greifst du denn darauf zu? Wenn sich dein Zugriff von dem wie er am Ende sein sollunterscheidet, solltest du deine Art zum Testen anpassen.

EDIT:
(Waehrend meines Posts wurde der Beitrag oberhalb editiert)
 
Mach es doch sauber und nutze Hostnamen + VHosts statt IP-Adressen
Ergänzung ()

DonConto schrieb:
Was liefert denn:

<?php
echo $_SERVER['SERVER_ADDR'];
?>

Den Hostnamen bekommst du dann mit:
<?php
echo $_SERVER['SERVER_NAME'];
?>[/QUOTE]
 
D708 schrieb:
localhost öffnet sich zumindestens die Seite auf dem Touchscreen
Wie @rocketworm vorgeschlagen hat wuerde sich dort der Hostname anbieten.
Abhaengig wie das Netz aufgebaut ist, muss der Hostname allerdings ueber die host-Dateien oder einem DNS aufgeloest werden.
Bei Apache wird das mit vhost geloest, bei nginx mit den Serverbloecken.

Alternativ kannst du die Interfaces auslesen und und darueber die IP ermitteln, glaube aber dass dafuer ein Skript/Middleware benoetigt, da PHP nicht genug Zugriffsrechte hat.
 
Crast schrieb:
Wie @rocketworm vorgeschlagen hat wuerde sich dort der Hostname anbieten.
Abhaengig wie das Netz aufgebaut ist, muss der Hostname allerdings ueber die host-Dateien oder einem DNS aufgeloest werden.
Bei Apache wird das mit vhost geloest, bei nginx mit den Serverbloecken.

Alternativ kannst du die Interfaces auslesen und und darueber die IP ermitteln, glaube aber dass dafuer ein Skript/Middleware benoetigt, da PHP nicht genug Zugriffsrechte hat.
Wie mir die vhost bei Apache helfen sollen, verstehe ich nicht so ganz. Die Namenauflösung passiert doch entweder über den Router oder über Hinterlegte Configs auf den Betriebsystemen. In wiefern hilft das jetzt dabei, dass PHP als Name nicht mehr "Localhost" ausliest sondern die passende IP Addresse vom DHCP des Routers? bzw wie hilft es den Autostart vom Kioskmodus von Chromium.

Über die Interfaces wäre ich sonst gegangen mit Python über PHP ausgeführt. Aber das ist für mich die uneleganteste Lösung. Aber anscheinend gibt es keinen "einfachen" Befehl nativ von PHP.
 
Wenn du den vHost in Apache auf deinen Hostname hoeren laesst, erlaubst du Apache bei anfragen mit dieser "Adresse" etwas auszuliefern, Anfragen diretk an die IP werden aber verworfen. Standardmaessig wird glaube ich bei Apache alle "Adressen" erlaubt. Das ganze ist also nur nebensaechlich.

Die Namensaufloesung passiert, wie du selbst sagst, im Router bzw auf dem OS (oder auf einem DNS Server).

Im PHP zeigst du nun nicht mehr die Adresse an, mit der die Seite aufgerufen wurde, sondern den Hostname an.
Somit erhaelt der Nutzer eine Adresse, mit der er arbeiten kann.
rocketworm schrieb:
Ergänzung ()


Den Hostnamen bekommst du dann mit:
<?php
echo $_SERVER['SERVER_NAME'];
?>

Wenn du aber moechtest, dass im Autostart die Adresse dynamisch gewaehlt wird, dann kannst du dir ein Startskript schreiben, dass im Autostart liegt, den Hostname ausliest bzw eine IP-Adresse.
In diesem Startskript koenntest du auch eine Datei erzeugen, in der die gewaehlte Adresse steht und mit PHP auslesen.

D708 schrieb:
Über die Interfaces wäre ich sonst gegangen mit Python über PHP ausgeführt. Aber das ist für mich die uneleganteste Lösung. Aber anscheinend gibt es keinen "einfachen" Befehl nativ von PHP.
Mir waere keiner bekannt. Vermute auch dass es aus Sicherhheitsgruenden nicht realisiert werden sollte.
Man sollte aber fuer jede Aufgabe die Sprahe nehmen, die dafuer am besten ist.
In diesem Fall ist PHP ungeeignet weitreichende Infos ueber den Host zu liefern, dafuer kann dann Python, JAVA, C oder Shell genutzt werden.
 
Zuletzt bearbeitet:
Nice, sowas in der Art habe ich gesucht. Zwar nicht ganz das, was ich erhofft habe, aber eleganter als alles andere. @r15ch13 Vielen Dank!
 
D708 schrieb:
::1. Die IP v6 des Servers. Das nutzt dem Anwender Garnichts.
Ergänzung ()

Code:
sudo nano /etc/default/grub

GRUB_CMDLINE_LINUX_DEFAULT="ipv6.disable=1"
GRUB_CMDLINE_LINUX="ipv6.disable=1"

sudo update-grub
sudo reboot
 
Naja, das änder aber nichts daran, dass danach dann die lokale Addresse angegeben wird. Dann steht da statt der lokalen IPv6 ::1 dann in IPv4 127.0.0.1. Solange ich die Webseite/PHP über den Loopback(Localhost) aufrufe, steht da immer die Localhost Addresse.

Ich kenne jetzt 3 Lösungswegen:
1. über den HTML Header und natürlich feste Lokale IP. Der Server ruft die eigene Webseite dann über die DHCP IP auf.
2. über den Servernamen, der dann per hinterlegten Datei wieder aufgeschlüsselt wird in eine IPv4. Funktioniert aber auch nur mit einer festen IP(solange der Server =~ Router ist)
3. Über Shellbefehle die mit PHP ausgeführt werden.

Die dritte Möglichkeit ist mMn die Zuverlässigste und eleganteste.
 
D708 schrieb:
Dann steht da statt der lokalen IPv6 ::1 dann in IPv4 127.0.0.1. Solange ich die Webseite/PHP über den Loopback(Localhost) aufrufe, steht da immer die Localhost Addresse.
Dein Problem ist, dass du die Adresse anzeigst mit dem die Seite aufgerufen wurde. Wenn du die Seite ueber den Hostname aufrufst wuerde dieser da stehen, wenn du die die Domain google.de in deiner Hostdatei auf localhost/::1/127.0.0.1 mappst wuerde das dort stehen. Der Grund: ein Server kann mehr als eine Adresse haben. Es gibt immer mindestens die Loopback Adresse, bzw Adressen wenn IPv6 unterstuetzt wird.
Wenn d den HTML Header ausliest wirst du auf das selbe Problem stossen, da dort die Adresse aufgefuehrt wird mit der Angefragt wird - Sofern du mit HTML Header den HTTP Header meinst. (Der HTML-Header befindet sich im HTTP-Response und ist das, was im <head>-Tag steht).

Ich werde mir das nochmal genauer anschauen
Moechte aber sicher gehen, dass ich wirklich verstanden aheb was du brauchst.
Du moechtest das alle dem Server zugewiesenen Adressen aufgefuehrt werden, wobei die Loopbacks rausgefiltert werden, richtig?
 
Ja, im Prinzip schon. Der Anwender muss wissen unter welcher Addresse er den Server erreichen kann. Die Seite wird auf dem angeschlossenen Bildschirm angezeigt.

Ich meinte HTTP Header. Die Möglichkeiten 1&2 sind im prinzip die Gleichen und funktionieren ja auch, solange ich den Code nicht als „Lokalhost“ ausführe. Nur ohne Static IP ist es nicht drin.
Ob ich jetzt nen HostNamen verwende oder nicht, ist doch egal, nur ein weiterer Zwischenschritt. Ich muss die IP Addresse doch fest hinterlegen. Dadurch gewinne ich doch nichts, wenn ich auf Dynamische IPS setze(wie sie in jedem StandartNetzwerk genutzt werden)
 
So hier dann einmal eine Zusammenfassung einer kurzen Google-Suche, ein paar Tests (sowohl PHP als CLI als auch in einem Webserver) und dem was mir gerade dazu einfaellt:

PHP:
<?php
$server_addr = $_SERVER['SERVER_ADDR'];
$server_name =  $_SERVER['SERVER_NAME'];
$host_name = gethostname(); // PHP < 5.3.0 php_uname('n')
$host_addr = gethostbyname(gethostname()); // PHP < 5.3.0 getHostByName(php_uname('n'))

$server_addr = Adresse des aufgerufenden Webservers
$server_name = Name des aufgerufenden Webservers
$host_name = Name des Hostsystems
$host_addr = Adresse des Hostsystems

Auf einem Host koennen beliebigviele Webserver laufen. Sprichst du einen Webserver an gibt $server_addr dir die Adresse mit der der Server angesprochen wurde und $server_name den Namen.
Diese beiden Werte kriegst du nur, wenn ein Webserver, z. B. Apache oder nginx verwendet wird. Verwendest du PHP als CLI entfallen die beiden Werte, bzw die Variable $_SERVER, da diese von dem jeweiligen Webserver bereitgestellt wird - fuer deinen Fall absolut uninteressant.

Du bist an dem Hostsystem interessiert (haette mir auch eher einfallen koennen, hatte die Anforderungen entweder anfangs nicht richtig verstanden oder insgesamt nicht genug darueber nachgedacht - sorry).
Ich habe es nur grob getestet, hat bei mir aber die lokale IP-Adresse zurueck gegeben - also die du auch gerne haettest.

Dokumentation:
https://secure.php.net/manual/en/function.gethostbyname.php
https://secure.php.net/manual/en/function.gethostbyname.php
 
Zurück
Oben