我正在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,我已经遇到了多个类似的问题但是没有一个提议的修复程序对我有用,这就是我问这个问题的原因。
预先感谢您的帮助
编辑
一些进展。
如果我按如下方式设置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漂亮的网址并不以“.php”后缀结尾。但是如何才能让这两个人相互配合呢?
我想这个想法是你有一个默认位置指向index.php
,当触发index.php文件时,nginx会收到另一个与你的php
位置块匹配的HTTP请求,并将请求代理到Apache。
问题是在第二次请求期间,URI的所有知识都丢失了,URI现在只是“index.php”,所以只要Apache知道你总是向/index.php
发出请求。
我仍然不知道如何解决它。
所以我想我已经弄明白了,如果你有类似的问题,可能的解决方案是将$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直接提供。
如果您发现此方法有任何问题,请告诉我。
UPDATE
我后来的一个愚蠢的错误导致我相信其他错误,每条路线似乎都显示我的“/”根路线的内容。在尝试使用Homestead而不是我的自定义设置后,我惊讶地发现它也影响了Homestead,因此它必须与我的应用本身而不是服务器相关。
基本上是异常处理程序返回根视图,因为我的请求丢失了我的FormRequests所需的一些数据,在更改我的异常处理程序类以处理它按预期工作的JSON响应之后。
如果你陷入这种陷阱,试着确保你的应用程序与Homestead一起工作,如果它确实你的流浪汉设置有问题,如果没有,那么这是你的Laravel应用程序的责任。
如果您的异常处理程序只执行典型的渲染,那么请注意它将尝试重定向到上一个路由的事实,如果您使用Postman开发API将是“/”。