Change root file aws nginx server - php

I have been stucked with this for a while. We have a Symfony 2.8 project and I want to deploy it to the cloud. I have properly created the ElasticBeanstalk environment and it works! But I still need to access http://domain/app.php in order to make it work. I managed to delete web/ changing documentDirectory part from URL but app.php is still there.
I have also tried with a new brand project following this:
https://docs.aws.amazon.com/es_es/elasticbeanstalk/latest/dg/php-symfony-tutorial.html
But when I change it to public/ happens to me the same I need to use index.php in the URL
I have modified NGINX conf following:
https://community.bitnami.com/t/how-to-change-default-root/65639/9
https://symfony.com/doc/current/setup/web_server_configuration.html
This is what I added to /etc/nginx/nginx.conf.default
location / {
try_files $uri $uri/ /app.php$is_args$args;
}
location ~ \.php$ {
try_files $uri $uri/ =404;
fastcgi_pass unix:/var/run/php-fpm/www.sock;
fastcgi_index app.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
I have restart nginx service using
sudo service nginx restart
but it remains the same.
I have also tried renaming app.php to index.php just in case. But I need to add /index.php to the URL then.
Any idea?

Use the index nginx directive to make app.php the default handler of http://domain/ requests:
server {
...
index app.php;
# your locations here
}

There are some things you can try.
https://symfony.com/doc/2.8/setup/web_server_configuration.html#nginx
Here you can find a configuration for your project. There you can see that the location is rewritten to the app.php.
location ~ ^/(app_dev|config)\.php(/|$) {
so i would suggest to take the configuration and test it.

Related

Nginx config for symfony on ubuntu

I want to setup symfony with nginx and this config is working fine
server {
listen 80;
root /src/web;
location / {
# try to serve file directly, fallback to app.php
try_files $uri /app.php$is_args$args;
}
location ~ ^/app\.php(/|$) {
fastcgi_pass unix:/run/php/php7.2-fpm.sock;
fastcgi_split_path_info ^(.+\.php)(/.*)$;
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
# Prevents URIs that include the front controller. This will 404:
# http://domain.tld/app.php/some-path
# Remove the internal directive to allow URIs like this
internal;
}
error_log /var/log/nginx/symfony_error.log;
access_log /var/log/nginx/symfony_access.log;
}
However i also want that on my server i should also be able to access files via app_dev.php and app_test.php as well
so far with above config. http://127.0.0.1/api/check is working fine
but i also want
http://127.0.0.1/app_dev.php/api/check and http://127.0.0.1/app_test.php/api/check to work as well.
Currently its gives me 404 error
Assuming your using this for development you can list each file (Environment) in a capturing group () and separate with | which basically means "or".
location ~ ^/(app|app_dev|app_test)\.php(/|$) {
....
}
It is important not to use this example on a production server, as it is completely unsecure.
On a production server your current conf, is correct to only allow app.php.
For more information you can use description from symfony and nginx official docs.
As you can see you should add some lines into your nginx conf file:
location ~ ^/(app_dev|config)\.php(/|$) {
...
}
In case you also need app_test.php, then it should be changed a little bit. Just by including the file name:
location ~ ^/(app_dev|app_test)\.php(/|$) {
...
}
But please have a note:
In production, don't include this and don't deploy app_dev.php or app_test.php
Also it would be better to have following configuration before error_log ...:
location ~ \.php$ {
return 404;
}

How to run subfolder with laravel in php rootfolder?

I have a project running under php, but I have a third party subfolder(download folder) that I want to add into the current project.
Meaning, root folder = testlaravel =>www.testlaravel.com
with sub folder = testlaravel/download => www.testlaravel.com/download
Is there anyway I can do this?
Are you using Apache or Nginx ? If Apache, you need to config your vhost file to serve Laravel from a sub-folder. Particularly, you need to configure that when testlaravel.com/download URI is requested, it should be served using /home/testlaravel/download/public directory (basically different root/home location).
You also need to use mod_rewrite to rewrite your URL requests to the sub-folder be served from index.php from above location (and also prettify URLs).
Similarly, your configuration in vhost for your main website will be different (so there will be 2 configurations, one for your main website and one for laravel requests)
The above should work just fine since its done same way in Nginx, for which I have included a full example of how its conf file should look
Here is how I setup-ed my location block which is working for me perfectly:
location ^~ /facebookschedule {
alias /home/netcans/facebookschedule/public;
try_files $uri $uri/ #foobar;
location ~ \.php {
fastcgi_pass unix:/var/run/php5-fpm.sock;
fastcgi_split_path_info ^(.+\.php)(.*)$;
include /etc/nginx/fastcgi_params;
fastcgi_param SCRIPT_FILENAME /var/wwww/facebookschedule/public/index.php;
}
}
location #foobar {
rewrite /facebookschedule/(.*)$ /facebookschedule/index.php?/$1 last;
}
Source: http://shubhank.gaur.io/setup-laravel-5-in-subfolder-with-nginx/
I am using the following configuration, which is simpler than most other published solutions, and which does not require any paths/folders to be hard-coded.
We simply prefix all requests with public/ and then remove it from SCRIPT_NAME so that the application can autodetect its environment correctly.
location ~ /myproject/(.*) {
rewrite /myproject(.*) /myproject/public/$1 break;
try_files $uri /myproject/public/index.php$is_args$args;
location ~ /index\.php$ {
include /etc/nginx/fastcgi.conf;
fastcgi_pass unix:/var/run/php-fpm/php-fpm.sock;
fastcgi_param SCRIPT_NAME /myproject/index.php;
}
}

Nginx Symfony2 Staging Config

i'm trying to configure nginx to serve several releases of one symfony project.
Releasefolder structure:
/var/www/my-project/releases/24/
/var/www/my-project/releases/46/
/var/www/my-project/releases/47/
I'd like to call a URL like "http://my-server/my-project/release/47" which should access /var/www/my-project/releases/47/web/app.php on the server.
I tried for a while now but couldn't find the final solution, any help would be great!
My last try:
server {
server_name my-server;
location / {
# try to serve file directly, fallback to app.php
try_files $uri $uri$2app.php$is_args$args;
}
location ~ /my-project/release/([-a-zA-Z0-9]+)/app\.php(/|$) {
root /var/www/my-project/releases/$1/web;
fastcgi_pass unix:/var/run/php5-fpm.sock;
fastcgi_split_path_info ^(.+\.php)(/.*)$;
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root/app.php;
fastcgi_param HTTPS off;
error_log /var/log/nginx/my-project_$1_error.log;
access_log /var/log/nginx/my-project_$1_access.log;
# Prevents URIs that include the front controller. This will 404:
# http://domain.tld/app.php/some-path
# Remove the internal directive to allow URIs like this
internal;
}
}
This config produces following error:
[error] 2272#0: *169 rewrite or internal redirection cycle while internally redirecting to "/my-project/release/47app.phpapp.phpapp.phpapp.phpapp.phpapp.phpapp.phpapp.phpapp.phpapp.phpapp.php"
You are missing a root directive in your server container -- is /var/www the default on your architecture? Otherwise, add a root directive:
root /var/www;
try_files is failing for find a match and will rewrite the URL by appending app.php to it. The resulting URL does not match your other location block, so it gets rewritten again and again.
The final term on your try_files directive is wrong. You have $2 where /web/ should be (probably inherited from a previous experiment).
Using try_files to make a general rewrite is a bad idea, as any mistyped URL could lead to a rewrite loop. Try:
location / {
rewrite ^(/my-project/release/[-a-zA-Z0-9]+)$ $1/app.php;
}
I changed the config to this:
server {
server_name my-server;
root /var/www;
location / {
rewrite ^(/my-project/release/[-a-zA-Z0-9]+)$ $1/app.php;
}
location ~ /my-project/release/([-a-zA-Z0-9]+)/app\.php(/|$) {
alias /var/www/my-project/releases/$1/web;
fastcgi_pass unix:/var/run/php5-fpm.sock;
fastcgi_split_path_info ^(.+\.php)(/.*)$;
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root/app.php;
fastcgi_param HTTPS off;
error_log /var/www/my-project/releases/$1/app/logs/nginx_error.log;
access_log /var/www/my-project/releases/$1/app/logs/nginx_access.log;
# Prevents URIs that include the front controller. This will 404:
# http://domain.tld/app.php/some-path
# Remove the internal directive to allow URIs like this
internal;
}
}
Now a call like "http://my-server/my-project/release/47" points correctly to "/var/www/my-project/releases/47/web/app.php".
The problem is now that the url "my-project/release/47" arrives at symfony router which can't find a route to this url.
What is now the right way to keep the url showing up like "//my-server/my-project/release/47" at browser but arrives at symfony as "//my-server/"?
Thank you all for your help, unfortunately i couln't get it working. I think i have to learn more about nginx configuration generally to be able to handle such problems, before i can use it in production.
My workaround for my problem is to create an own nginx conf per release. The file will be created at build process, is then transfered to the webserver, copied to /etc/nginx/conf.d/[releasename].conf and activated by sudo service nginx reload.
A deinstallation script within the release dir removes sources and config, when release no longer needed.

phalcon php "invo sample application" using nginx

I tried to learn and configure phalcon by testing INVO sample application
It appears that the tutorial doesn't include nginx config for the testing so that I got some difficulty to test the sample application.
I used nginx as the web server, I took nginx configuration from here
Here is my nginx config:
server {
listen 80;
server_name local.phalcon.dev;
access_log /Users/mylocal/www/log/phalcon.access.log;
error_log /Users/mylocal/www/log/phalcon.error.log;
index index.php index.html index.htm;
set $root_path '/Users/mylocal/www/phalcon/current';
root $root_path;
try_files $uri $uri/ #rewrite;
location #rewrite {
rewrite ^/(.*)$ /index.php?_url=/$1;
}
location ~ \.php {
fastcgi_pass 127.0.0.1:9000;
fastcgi_index /index.php;
include /usr/local/etc/nginx/fastcgi_params;
fastcgi_split_path_info ^(.+\.php)(/.+)$;
fastcgi_param PATH_INFO $fastcgi_path_info;
fastcgi_param PATH_TRANSLATED $document_root$fastcgi_path_info;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
}
location ~* ^/(css|img|js|flv|swf|download)/(.+)$ {
root $root_path;
}
location ~ /\.ht {
deny all;
}
}
Looking at the tutorial, I believe the structure is like this:
webroot
invo
app
...
public
index.php
...
...
which means, webroot is my /Users/mylocal/www/phalcon/current
and I should be able to access it with this url http://local.phalcon.dev/invo
It lead to 403 forbidden which is understandable because it appears that we should rewrite path from webroot/invo to webroot/invo/public
I did some trial and error changing the configuration but found no luck, can somebody help me to configure the nginx config for that tutorial? (which means accessing it from http://local.phalcon.dev/invo)
PS:
I was able to access it by changing the $root_path into /Users/mylocal/www/phalcon/current/invoice/public
and changing the $url->setBaseUri($config->application->baseUri); into $url->setBaseUri('/'); in invo/public/index.php
but that means I accessed it from url http://local.phalcon.dev NOT http://local.phalcon.dev/invo
To access it via http://local.phalcon.dev/invo instead of http://local.phalcon.dev all you need to do now is to configure the routing. I think in your case you simply need to set the base uri as per this example:
//Setup a base URI so that all generated URIs include the "tutorial" folder
$di->set('url', function(){
$url = new \Phalcon\Mvc\Url();
$url->setBaseUri('/tutorial/');
return $url;
});
I'm also getting a feeling that you also want to use http://local.phalcon.dev for other Phalcon apps? If that's the case then it will not work. All requests are forwarded to index.php, which rules out what to do. You can create multi-module app, but you can't have different apps sittings on the same domain (without serious pain).
the only directory which should be available via url is public. You home direcotry must end with public something like:
/Users/mylocal/www/phalcon/public
and you will be able to use base dir of /:
$di->set('url', function(){
$url = new \Phalcon\Mvc\Url();
$url->setBaseUri('/');
return $url;
});
of course you can use whatever name for your public dir, but not recommended, because if you will want to use phalcon's devtools, they are working with home dir called "public"
Please check app/config/config.ini file. There is a "baseUri" section.
1. nginx root_path should be "webroot/invo/public.
2. phalcon code: app/config/config.ini -> baseUri = /
3. url: local.phalcon.dev

nginx + php with drupal + codeigniter in separate folders

I have a Slicehost slice for a dev server, with nginx and PHP.
I'm trying to get drupal running on localhost/drupal and a codeigniter app running on localhost/codeigniter.
I can get one or the other to work, but not both -- the rewrite and fastcgi seem to be interfering with one another.
Does anyone know how to have /drupal and /codeigniter both working, with rewrite rules (for SEF URLs), in separate folders in my /var/www?
Cheers.
Ok, you have to create a file (no extension needed) in /etc/nginx/sites-available that represents the name of your folder/domain (ex: drupal, yoursite.com).
Here's a sample file:
server {
server_name yourdomain.com;
root /var/www/yourdomain;
index index.php;
location / {
autoindex on;
try_files $uri $uri/ /index.php;
}
location ~ \.php$ {
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
include fastcgi_params;
}
}
In the sample above it will actually send url rewrites to $_SERVER['REQUEST_URI']. For more nginx rewrites, you can take a look at http://wiki.nginx.org/HttpRewriteModule for more reference.
Then you want to enable it by creating a symlink of this file in your /etc/nginx/sites-enabled folder
Example: # ln -s /etc/nginx/sites-available/yoursite /etc/nginx/sites-enabled/yoursite
Then restart/reload nginx
# services nginx reload

Categories