如何正确使用url路径指向使用nginx的laravel应用程序?

时间:2017-01-09 05:56:03

标签: php laravel cakephp nginx

我有以下nginx配置

server {
        listen 80;
        client_max_body_size 2M;
        server_name some.app;
        root /var/virtual/a-cakephp-app/webroot;
        access_log /var/log/nginx/a-cakephp-app-access.log;
        include common.conf;
        include cakephp.conf;
        location /billing/ {
                proxy_set_header X-Real-IP $remote_addr;
                proxy_set_header HOST $http_host;
                proxy_set_header X-NginX-Proxy true;

                proxy_pass http://127.0.0.1:89;
                proxy_redirect off;
                rewrite ^/billing/(.*)$ /$1 break;
        }

我的网络用户是:

/var/virtual/a-cakephp-app ==>通往cakephp文件夹的虚拟路径(绝对有效)

/var/virtual/a-laravel-app ==>通往laravel文件夹的虚拟路径(不太确定如何测试)

我想要实现的目标

我有一个在http://some.app运行的cakephp 2应用。我想要的是在http://some.app/billing

启动另一个运行Laravel的应用程序

我的Laravel .env

APP_ENV=local
APP_DEBUG=true
APP_KEY=base64:somekey
APP_URL=http://some.app/billing

DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306

我得到了什么

我遇到了错误的网关错误

我期待什么

我希望laravel应用程序可以在不影响cakephp应用程序的情况下工作

4 个答案:

答案 0 :(得分:1)

  1. 在单个域上混合和匹配独立应用程序通常是一个坏主意,这可能导致安全问题w.r.t.饼干。

  2. 您正在尝试将proxy_pass用于Laravel,这是一个PHP框架。请注意,当要求在HTTP over TCP表单中将请求传递到在指定端口(例如,Apache Tomcat,Jetty等)上运行的后续HTTP服务器时,将使用此指令。

    PHP(以及Laravel)可以由nginx本身运行,并且不需要单独的服务器,因此,proxy_pass设置可能是错误的,应该是合适的fastcgi_pass改为使用指令集(从nginx中执行正常方式php)。

  3. 我们不知道你include的文件中有什么,但是,它们确实包含一个location ~ \.php$指令(用于处理你的php文件)是一个很好的猜测现有的php应用程序)。

    请注意,根据http://nginx.org/r/locationlocation这样的正则表达式location ~ \.php$优先于location /billing/之类的前缀字符串位置,当/billing/index.php这样的文件时访问{1}}。

    要修改此类行为,请使用^~说明符作为前缀字符串位置,例如location ^~ /billing/

  4. 总之,我会使用一个单独的域名。否则,请使用location ^~ /billing/,并将所有正确的fastcgi放入其中。

答案 1 :(得分:0)

理想情况下,您不应将所有配置混合在一个文件下。 nginx.conf应该只包含gzip等通用配置,而不是提供服务器令牌等。单个文件应该在启用站点的文件夹下

为什么坏的网关错误可能会因为您应该有一个根然后多个位置块来处理相同的错误。

此外,一旦进入计费模块,您是否尝试重写它以删除结算文件夹?为什么呢?

答案 2 :(得分:0)

你需要告诉nginx / billing / paths的根目录是不同的:

np.digitize

答案 3 :(得分:0)

我保留原始配置:

server {
        listen 80;
        client_max_body_size 2M;
        server_name some.app;
        root /var/virtual/a-cakephp-app/webroot;
        access_log /var/log/nginx/a-cakephp-app-access.log;
        include common.conf;
        include cakephp.conf;
        location /billing/ {
                proxy_set_header X-Real-IP $remote_addr;
                proxy_set_header HOST $http_host;
                proxy_set_header X-NginX-Proxy true;

                proxy_pass http://127.0.0.1:89;
                proxy_redirect off;
                rewrite ^/billing/(.*)$ /$1 break;
        }

然后我在那之后创建了这个配置:

server {
        listen 89;
        client_max_body_size 2M;
        server_name 127.0.0.1;
        root /var/virtual/a-cakephp-app/another-laravel-app/public;
        include common.conf;
        include cakephp.conf;
}

注意只要服务器没有将其用于其他应用程序

,端口89就无关紧要了