我在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
发出请求。
我仍然不知道如何修复它。
答案 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;