Laravel - 所有路线上的NGINX + Apache反向代理404

时间:2018-01-04 14:59:31

标签: laravel apache .htaccess mod-rewrite nginx

我在Laravel中设置了一个项目,该项目使用基于Ubuntu 14.04的自定义流浪盒,并在典型的反向代理设置中运行NGINX和Apache。

现在,问题是沿途没有注册URL路径,所以当我输入http://mydomain.test/hello时,我最终得到的只是另一端的http://mydomain.test/index.php,它似乎完全忘记路线参数。

我使用Apache 2.4.7和Mod PHP,Apache配置如下。

<VirtualHost 127.0.0.1:8080>
    ServerName application.test
    ServerAlias www.application.test
    DocumentRoot "/home/vagrant/application/public"

    ErrorLog /var/log/apache2/error.log
    CustomLog /var/log/apache2/access.log combined

    <Directory "/home/vagrant/application/public">
        Require all granted
        AllowOverride all
    </Directory>
</VirtualHost>

如上所述,Apache正在侦听端口8080,NGINX正在使用以下配置侦听端口80.

server {
    listen 80;
    server_name application.test www.application.test;

    root /home/vagrant/application/public;
    index index.php index.html;

    location / {
        try_files $uri $uri/ /index.php?$is_args$args;
    }

    location ~ \.php$ {
        proxy_pass http://localhost:8080;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
    }

    location ~ /\. {
      deny all;
    }
}

我可以确认所有Laravel要求都已完成,所以我有MBString,OpenSSL等...我也可以确认重写模块正在工作,因为我可以向我的.htaccess添加重定向子句它确实按预期执行。

这是我的.htaccess文件。

<IfModule mod_rewrite.c>
    <IfModule mod_negotiation.c>
        Options -MultiViews -Indexes
    </IfModule>

    RewriteEngine On

    # Handle Authorization Header
    RewriteCond %{HTTP:Authorization} .
    RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]

    # Redirect Trailing Slashes If Not A Folder...
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond %{REQUEST_URI} (.+)/$
    RewriteRule ^ %1 [L,R=301]

    # Handle Front Controller...
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteRule ^ index.php [L]
</IfModule>

我可能在这里遗漏了什么吗?我之前已经配置过NGINX和PHP-FPM,但是我第一次使用Apache,我已经经历了多个类似的问题,但是没有一个提议的修复程序对我有用而且#&#&## 39;为什么我问这个问题。

提前感谢您的帮助

修改

取得了一些进展。

如果我按如下方式设置NGINX的位置配置

location / {
    proxy_pass http://localhost:8080;
    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header X-Forwarded-Proto $scheme;
}

然后它可以工作,但据我所知,这意味着即使是静态文件请求最终也会代理到Apache。

location ~ \.php$似乎不起作用,因为laravel漂亮的网址不会以&#34; .php&#34;后缀我猜。但是如何才能让这两个人相互配合呢?

我想这个想法是你有一个默认位置指向index.php,当触发index.php文件时,nginx会收到另一个与你的php位置块匹配的HTTP请求并代理对Apache的请求。

问题是在第二次请求期间,所有关于URI的知识都丢失了,而URI现在只是&#34; index.php&#34;所以,只要Apache知道你总是向/index.php发出请求。

我仍然不知道如何修复它。

1 个答案:

答案 0 :(得分:1)

所以我想我已经弄清楚了,如果你有类似的问题,可能的解决方案是将$uri变量添加到try_files指令

server {
    listen 80;
    server_name application.test www.application.test;

    root /home/vagrant/application/public;
    index index.php index.html;

    location / {
        try_files $uri $uri/ /index.php$uri;
    }

    location ~ \.php {
        proxy_pass http://localhost:8080;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
    }

    location ~ /\. {
      deny all;
    }
}

这样,当nginx调用你的index.php时,它会像http://application.test/index.php/hello一样调用它,这就是Apache最终通过PHP接收和处理的URL。

那么,.htaccess发挥作用,Laravel做了它的事情,一切正常,这仍然只影响PHP文件,你的静态文件仍应由NGINX直接提供。

如果您发现此方法有任何问题,请告知我们。

<强>更新

我后来的一个愚蠢的错误导致我相信其他错误,每条路线似乎都显示了我的&#34; /&#34;根路线。 在尝试使用Homestead而不是我的自定义设置后,我惊讶地发现它也影响了Homestead,所以它必须与我的应用程序本身有关,而不是与服务器有关。

基本上是异常处理程序返回根视图,因为我的请求丢失了我的FormRequests所需的一些数据,在更改我的异常处理程序类以处理它按预期工作的JSON响应之后。

  

如果您遇到这种陷阱,请尝试确保您的应用与Homestead配合使用,如果确实如此,那么您的流浪设置会出现问题,如果没有,那么它就是您的Laravel应用这应该归咎于。

     

如果您的异常处理程序只执行典型的渲染,那么请注意它将尝试重定向到上一个路由的事实,如果您正在使用Postman开发API将是&#34; /&#34;