Ok I'm new to Laravel so went straight to the documentation to get started. There are massive holes in the documentation so it took a lot of effort and googling to fill the gaps in order to get Laravel set-up. I now have it set up and moved on to the next step in the quick start guide.I created my route
Route::get('users', function()
{
return 'Users!';
});
Now it says:
Now, if you hit the /users route in your web browser, you should see Users!
So I hit up:
http://localhost/laravel/users
but get a 404? I tried
http://localhost/laravel/public/users
but still a 404? I followed the steps on the quick start guide to the letter, what am I missing?
Seems like your Laravel app is accesible via an Apache HTTP alias, because your URL looks like: http://localhost/laravel/. If this is the case and assuming that http://localhost/laravel is pointing to your public directory, then follow these steps:
Try to navigate to your expected route prepend it with /index.php/, in your case: http://localhost/laravel/index.php/users. If it works (no 404) then you problem is with the Rewrite Module configuration of Apache HTTP, you should follow the next steps.
Edit the file public/.htaccess.
Under the line RewriteEngine On add RewriteBase /laravel/.
Try to navigate to an existing route.
Basically, if you app resides in a alias or virtual directory (say http://localhost/alias) you should add an entry in your rewrite rule to rewrite the base directory with alias.
The problem is well explained by Rubens above, A simpler solution is to use the supplied built-in PHP Server by issuing this command
php artisan serve --port=8080
Note that I am using port 8080 here, you can omit it.Now you can browse the site by going to
localhost/users
and it should work!
Apache isn't probably reading the public/.htaccess file due to the directive AllowOverride being set to None. Try to set it to All.
Laravel 4 simple route not working using mod_rewrite, and .htaccess
I had the same problem and spent hours to solve it.
I have several apps under the same domain, but in different segments. So Laravel's url is http://myhostname/mysubdir/
My controllers were only working as http://myhostname/mysubdir/index.php/mycontroller
On /var/www/.../public/.htaccess I put RewriteBase /mysubdir and worked!!!
I know this question is 4 years old but still it have its significance.Rubens Mariuzzo was answered it correctly but I want to add some points on it. You said
"There are massive holes in the documentation so it took a lot of effort and googling to fill the gaps in order to get Laravel set-up"
For beginners it is difficult to find correct way of configuring Laravel. Once it is mastered it is fun developing Laravel :) . There are certain correct way of doing this.
Download Laravel
Configure DB
Map DB in .env
Make auth: php artisan make:auth
Create model and migration together: php artisan make:model Todo -m
Migrate: php artisan migrate
Create controller and routes together: php artisan make:controller
TodoController --resource
Create view for each action
Code the controller
Detailed description is given in this blog http://masterlaravel.blogspot.in/2017/08/laravelquick-start-composer-create.html
please refer to this follow url and see RoboTamer's config:
http://forums.laravel.io/viewtopic.php?id=511
it solved my problem the same as yours
solution in nginx:
server {
server_name .laravel.dev;
root /home/tamer/code/laravel/public;
index index.php index.html;
#browse folders if no index file
autoindex on;
# serve static files directly
location ~* \.(jpg|jpeg|gif|css|png|js|ico|html)$ {
access_log off;
expires max;
}
# removes trailing slashes (prevents SEO duplicate content issues)
if (!-d $request_filename)
{
rewrite ^/(.+)/$ /$1 permanent;
}
# enforce NO www
if ($host ~* ^www\.(.*))
{
set $host_without_www $1;
rewrite ^/(.*)$ $scheme://$host_without_www/$1 permanent;
}
# canonicalize codeigniter url end points
# if your default controller is something other than "welcome" you should change the following
if ($request_uri ~* ^(/lobby(/index)?|/index(.php)?)/?$)
{
rewrite ^(.*)$ / permanent;
}
# removes trailing "index" from all controllers
if ($request_uri ~* index/?$)
{
rewrite ^/(.*)/index/?$ /$1 permanent;
}
# unless the request is for a valid file (image, js, css, etc.), send to bootstrap
if (!-e $request_filename)
{
rewrite ^/(.*)$ /index.php?/$1 last;
break;
}
# catch all
error_page 404 /index.php;
location ~ \.php$ {
try_files $uri =404;
fastcgi_pass unix:/tmp/php.socket;
fastcgi_index index.php;
#include fastcgi_params;
include /home/tamer/code/nginx/fastcgi_params;
}
access_log /home/tamer/code/laravel/storage/logs.access.log;
error_log /home/tamer/code/laravel/storage/logs.error.log;
}
Thanks. Knowledge of the above by #rubens, and a comment by #GaryJ here made me do this to make it work from my Apache virtual hosts file.
Copied these lines from .htaccess file in laravel within node of the vhosts config.
Removed my .htaccess file (it was anyway not being applied, i am on a windows apache virtual host, laravel env)
RewriteEngine On
# Redirect Trailing Slashes...
RewriteRule ^(.*)/$ /$1 [L,R=301]
# Handle Front Controller...
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^ index.php [L]
Better:
Later read #Ag0r0 's reply, that worked. i was missing the allow override, making the above neccessary. once allowoverride all was there, the default settings itself worked.
In my case (Ubuntu 14.04 LTS & Apache 2.2) I was stuck at #1 step of #Rubens' solution. I could see the page with this url: http://localhost/laravel/index.php/users but step #2 and others didn't work.
Also I've tried to add RewriteBase /laravel/public to .htaccess but it didn't work too.
Then I've set up a new virtual host with the help of this awesome tutorial: https://www.digitalocean.com/community/tutorials/how-to-set-up-apache-virtual-hosts-on-ubuntu-14-04-lts (they rock with these tuts)
In addition to tutorial, I've set DocumentRoot (in example.com.conf file) like this:
DocumentRoot /var/www/laravel/public
Yes, public is the big deal here.
Btw, don't put RewriteBase /laravel/ to your .htacces file otherwise you'll get HTTP/500 error.
Now, I can see example.com/users page.
my previous post with the describtion of the problem was deleted, but it was similar to the situation that is described here.
anyway... simply i have tried all the possibilities that are described here as well as on other pages and I did not find solution to my problem.
The fresh installation of the Laraval simply did not worked.... after trying everythink from this post i decided to create yet another fresh installation and miracle happened this installation is actually working...
So my advice is: if you are not able to fix this problem just try to create another installation of the laravel and it might actually work.
This might be actually the easiest way how to fix your problem in case you are starting from the scrach.
Related
I have been looking to rewrite my api URLs so they don't have a trailing slash. I use NGinx and not Apache. I did find this answer to the same question for an Apache server, but it is not going to work out of the box for NGinx.
I ended up taking this sample Apache config and used a config rewrite service to convert the config to Nginx format. It produces a mostly working, but slightly broken solution. It accesses the URLs like it is supposed to, but it breaks accessing resources and causes the /api/index.php to be dumped as a download when accessing a non-existent file or directory in /api/.
I played around with the config to produce the below config which uses the html 404 message provided to the whole server.
NGinx
location /api {
if (-e $request_filename){
rewrite ^/(.*[^/])$ /$1/;
}
}
My File structure is:
/api/index.php
/api/hotbits/index.php
/api/cryptography/index.php
With the new config option, this translates to these functional URLs:
/api
/api/
/api/hotbits
/api/hotbits/
/api/cryptography
/api/cryptography/
I have a custom PHP application which follows the basic MVC pattern of development. The applications directory structure is as follows:
admin/
default/
index.php
In the admin is another index.php (which is how it handles requests to /admin).
In apache, this worked by putting a .htaccess file in each directory (admin and doc root) setting up a rewite and the application works. In NGINX, it doesnt seem so simple.
I can get the basic "default" application to work, by using this in my nginx.conf:
if (!-e $request_filename)
{
rewrite ^(.+)$ /index.php?path=$1 last;
}
(we run on vhosts so I cannot reference location / or I get a duplicate rule error).
This gets the frontend application to work, but when I try to access the /admin portion of the application the login screen loads, but when I try to submit and it tries to hit the endpoint 'admin/index/index' it fails, as my rewrite rule doesnt work. Here is what I have for the rewrite in NGINX:
location /admin {
try_files $uri $uri/ /admin/index.php?path=$uri&$args;
}
I think the issue is that the $uri being passed in is /admin/index/index instead of it being what it should be and is under Apache: /index/index.
Can anyone help me correct these NGINX rules so that my application works properly?
Thanks in advance.
As you said, you pass in the extra $uri. Try this:
location /admin {
try_files $uri $uri/ /admin/index.php?$args;
}
I am running a joomla 2.5 site on ubuntu server with php/nginx/mysql (fairly new to nginx)
My problem is that when a user hits a url, I need it to ignore the .html file extension.
For example, if you hit mysite.com/page then it renders the page fine.
If you hit mysite.com/page.html then it will throw a 404 error. Which is because there isn't actually a 'page.html' page on my site. Its a K2 article alias. Yes, I could not put .html in but its not me adding content to the site, its the client. I have recently moved server and before it worked fine, now it doesnt so I know I have missed something in the config.
I know I can get nginx to do the opposite of what I want, with try files. Not sure how to get it to do the reverse.
This is my nginx config:
location / {
# First attempt to serve request as file, then
# as directory, then fall back to index.html
try_files $uri $uri/ /index.php;
# Uncomment to enable naxsi on this location
# include /etc/nginx/naxsi.rules
}
Now I know if i had a page.html page and I wanted to hide the .html I could add $uri.html
What I want to know is how to get nginx to try page.html if it cant find it try page
So turned out to be a Joomla Config variable. Under SEO settings in global config set 'apply suffix' to yes. I feel quite stupid. Thanks to all those that tried to help, as always much appreciated.
Here's a potential solution I managed to come across:
location / {
# If /{foo} is not an existing file or directory, rewrite to /{foo}.html
if (!-e $request_filename) {
rewrite ^(.+)$ /$1.html break;
}
# Redirect all {foo}.html URLS to /{foo}
rewrite ^/(.*)\.html$ /$1 redirect;
}
If you can correctly write .htaccess rewrite lines, try using a htaccess-to-nginx converter
As commented, this will check for the existence of a directory, file, etc. using the current URL. If nothing exists, it will attempt to request the url with .html appended.
Additionally, if .html is already present in the URL, it will redirect to the URL without .html
Quick workaround:
rewrite ^(. *)\.html$ $1 break;
Should be the first rewrite in the stack, even before try_files.
I am trying to accomplish two things in regards to nginx rewrites. First is to rewrite something like this:
oldvhost.domain.com/?dir=Dir1/Dir2/Dir3 -->
newvhost.domain.com/?dir=./Dir1/Dir2/Dir3
Notice the "./" in front of the second vhost?
Secondly I am trying to rewrite something like this:
oldvhost.domain.com/orginal.php?file=Dir1/Dir2/Dir3/file.zip ->
newvhost.domain.com/newphpfile.php?file=./Dir1/Dir2/Dir3/file.zip
I have managed to get this to work "somewhat" by doing this on the new vhost before any location commands:
rewrite ^/original.php$ /newphpfile.php$1 last;
But this isn't working 100% and is only remedied by the $realpath PHP function. I still need this working via regex rewrite but there's something about the "?"s that are making it fail.
As for the redirection you can do this in a location
location /something
return 301 http://example.com/?dir=./$arg_dir;
}
Or if you want it as a rewrite
rewrite /old-example.com/location-from.php http://example.com/new-location.php?./$arg_dir permanent;
and for the rewrite it should be similar as the second redirection, but no need for full host name
rewrite /old-location.php /new-location.php?./$arg_dir;
And here's the documentation of the $arg_name
The best way to do this in Nginx would be a rewrite, using reg expressions.. Try the code below in your virtual host.
location / {
#Rewrite for directory
rewrite ^/?dir=(.*) http://yoururl.com/?dir=./$1;
#rewrite for file
rewrite ^/origional.php?file=(.*) http://yoururl.com/newphpfile.php?file=./$1;
}
The first rewrite takes care of your directory. Please note it is being assumed that all incoming links do not have the necessary ./ you need. If they come with the ./ it may cause breakage. Or it may cause nothing, depending on what the PHP is doing.
I wasted many hours to find, how to redirect all requests to index.php.
I mean:
site.com/some-url?param&1
will become
site.com/index.php and $_SERVER[REQUEST_URI] === some-url?param&1
I've one hip hop archive (based on Nette Framework) and one virtualhost (one hiphop isntance proxied from Nginx).
Edit:
Alternative question can be: how to setup nginx to modify REQUEST_URI field sent to PHP over FastCGI?
You have to add a rewrite rule to the main config.hdf file. hhvm does not support reading .htaccess files.
# In my app I have a public side and and admin
# side. All requests to the public side should
# be rerouted through a script. All requests to
# the backend .php and static asset files should
# be allowed.
* {
# rewrite every request onto
# /myapp/page.php/<original request>
pattern = ^(.*)$
to = /myapp/page.php/$1
# append any query strings.
qsa = true
}
I wrote an article about configuring hhvm.
If you use Nginx in front of HHVM then you probably want the static files to be served by Nginx (because it's faster) and everything else pass to index.php. In your Nginx site configuration you can do that as follows:
location / {
try_files $uri $uri/ index.php?$args;
}
I'm not familiar with HipHop but .htaccess on Apache can take care of this with RewriteRules