There are plenty of similar questions out there, but none that I've found resolve my specific problem. I'm quite sure it's a configuration in my local IIS server, but I haven't been able to work it out myself. FYI, my local dev machine is Windows 11, and I'm running IIS 10.
I have the following simple code in my Laravel routes/web.php
file:
Route::get('/info', function() { return '<!DOCTYPE html>
<html><head><title>Testing</title></head>
<body>
<p>Hello from simple route</p>
<p><?php
echo phpinfo();
?></p>
</body></html>'; });
Route::get('/info2', function() { return view('info'); });
Then I have the resources/views/info.blade.php
file that looks like this
<!DOCTYPE html>
<html>
<head>
<title>Info Test 2</title>
</head>
<body>
<p>Hello from Blade Template</p>
<p><?php
echo phpinfo();
?></p>
</body>
</html>
When I access http://myserver/info2
in the browser, I get a nicely formatted PHP-info page as one would expect. This proves that PHP is running correctly on my IIS setup.
But when I access http://myserver/info
, I only get text from paragraph 1 of the HTML document, saying "Hello from simple route". PHP-info is not rendered, and looking at the dev-tools output we can see that the <?php
tags are commented out:
I understand that this is because IIS isn't recognising that it it dealing with a *.php
file, and therefore doesn't realise that it should pass the response through its PHP parser. But what I don't understand is why it doesn't work only for "simple" Laravel routes compared with Blade templates. (If I understood why, I'd probably be able to work out which IIS config to change to fix it).
Under the IIS server "Handler Mappings", I have the following setup:
I've tried setting up a *.html
and a *
path to the above config, so that it doesn't always look for a PHP file to call the FastCGI/PHP processor, but none of this has worked. Can anyone help point me in the right direction?
CodePudding user response:
When you return in /info a string, it will not be parsed as a file like resources/views/info.blade.php.
It will be just returned as string.
So <?php ?>
will not be parsed by PHP.
This will work:
Route::get('/info', function() {
ob_start();
phpinfo();
$phpinfo = ob_get_clean();
return '<!DOCTYPE html>
<html><head><title>Testing</title></head>
<body>
<p>Hello from simple route</p>
<p>'.$phpinfo.'</p>
</body></html>';
});
Route::get('/info2', function() { return view('info'); });
Why i am using ob_start()/ob_get_clean()
?
Look here https://www.php.net/manual/de/function.phpinfo.php
phpinfo()
returns a bool, not the content itself.
The content will be outputed directly. So if you want to catch it and write it into a variable you can use ob_start()/ob_get_clean()
to do that.