【发布时间】:2018-06-14 08:11:16
【问题描述】:
我正在 Laravel 中建立一个项目,它使用基于 Ubuntu 14.04 的自定义 vagrant box,并在典型的反向代理设置中运行 NGINX 和 Apache。
现在,问题是沿途的某些东西没有注册 URL 路径,所以当我输入 http://mydomain.test/hello 时,我最终得到的只是另一端的 http://mydomain.test/index.php,它似乎完全忘记了路线参数。
我正在使用带有 Mod PHP 的 Apache 2.4.7,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 漂亮的 url 不以“.php”后缀结尾。但是如何才能让这两个玩得很好呢?
我猜的想法是您有一个指向index.php 的默认位置,当触发该 index.php 文件时,nginx 会收到另一个与您的php 位置块匹配的 HTTP 请求,并将请求代理到 Apache .
问题在于,在第二次请求期间,所有关于 URI 的知识都丢失了,并且 URI 现在只是“index.php”,因此就 Apache 所知,您总是向 /index.php 发出请求。
我仍然不知道如何解决它。
【问题讨论】:
-
顺便说一下,我使用 Apache 的原因是服务器是这样配置的,我需要我的 Vagrant 配置与服务器紧密匹配。这就是为什么我要做整个 Apache 反向代理的事情,所以请不要只告诉我使用 PHP-FPM,因为我不能。
标签: laravel apache .htaccess mod-rewrite nginx