所有路线都指向/
all routes point to /
我有一个 Javascript 应用程序使用 Slim (slimframework.com) 作为 API 端点。
我在以前的电脑 (win 8) 上使用它已经有一段时间了,但是移动了它,现在它在 OSX 上 运行 (Apache 2.4.9 php 5.5 ).
奇怪的是,在这次迁移之后,无论我尝试什么 GET 路由,它们都会路由到 /(默认路由)。当我尝试获取请求的路径时(如您在“/”路径中看到的那样),它显示了正确的请求。
我把它全部拆开并设置了最小的布局。相同的结果。
php:
require 'Slim/Slim.php';
\Slim\Slim::registerAutoloader();
$app = new \Slim\Slim();
$app->get('/hello/:name', function ($name) {
echo "Hello, $name";
});
$app->get('/', function () use ($app) {
echo "root" . $app->request()->getPath();
});
$app->run();
调用 /hello/world 应该 return 字符串 "Hello, world"。但取而代之的是 returns "root /hello/world/" 注意尾部的斜线..这也适用于任何其他路线(即 /hello/world/and/other/planets/as/well returns "root/hello/world/and/other/planets/as/well/").
我想知道这是否与我的虚拟主机配置有关(但我有很多使用 url 重写的应用程序,这似乎有效)
httpd-vhost.conf
<VirtualHost *:80>
ServerName stage_api.loc
ServerAlias stage_api.loc
DocumentRoot "[the correct dir]"
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule (.*) /index.php [L,QSA]
<Directory "[the correct dir]">
Options Indexes FollowSymlinks MultiViews
AllowOverride All
Require all granted
</Directory>
</VirtualHost>
奇怪的是,如果我从 vhost 配置中省略 FollowSymLinks,整个过程就会失败。
我在这里遗漏了什么?任何帮助表示赞赏。
B
更新:
害怕被视为轻微强迫症...但我添加了 print_r($_SERVER);到 index.php,一切似乎都是正确的
Array
(
[SCRIPT_URL] => /hello/world
[SCRIPT_URI] => http://stage_api.loc/hello/world
[HTTP_HOST] => stage_api.loc
[HTTP_CONNECTION] => keep-alive
[HTTP_CACHE_CONTROL] => no-cache
[HTTP_USER_AGENT] => Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.99 Safari/537.36
[HTTP_ACCEPT] => */*
[HTTP_ACCEPT_ENCODING] => gzip, deflate, sdch
[HTTP_ACCEPT_LANGUAGE] => en,en-US;q=0.8,nb;q=0.6
[PATH] => [removed by user]
[SERVER_SIGNATURE] =>
[SERVER_SOFTWARE] => Apache/2.4.9 (Unix) OpenSSL/0.9.8za PHP/5.5.14
[SERVER_NAME] => stage_api.loc
[SERVER_ADDR] => 127.0.0.1
[SERVER_PORT] => 80
[REMOTE_ADDR] => 127.0.0.1
[DOCUMENT_ROOT] => [removed by user]
[REQUEST_SCHEME] => http
[CONTEXT_PREFIX] =>
[CONTEXT_DOCUMENT_ROOT] => [removed by user]
[SERVER_ADMIN] => you@example.com
[SCRIPT_FILENAME] => [removed by user]/index.php
[REMOTE_PORT] => [removed by user]
[GATEWAY_INTERFACE] => CGI/1.1
[SERVER_PROTOCOL] => HTTP/1.1
[REQUEST_METHOD] => GET
[QUERY_STRING] =>
[REQUEST_URI] => /hello/world
[SCRIPT_NAME] => /hello/world
[PHP_SELF] => /hello/world
[REQUEST_TIME_FLOAT] => 1421675412.017
[REQUEST_TIME] => 1421675412
[argv] => Array
(
)
[argc] => 0
)
所以。使用 Whosebug 作为 rubberduck 我最终想出了一个解决方案(如果有人偶然发现了同样的问题)。
使用重写的 url 时,环境在 Slim 框架中被误解。
必须覆盖 Environment.php 中 属性 的设置(第 143 行)
from:
$env['PATH_INFO'] = substr_replace($requestUri, '', 0, strlen($physicalPath));
to:
$env['PATH_INFO'] = $_SERVER['REQUEST_URI'];
这当然不理想。但是让我起来 运行,同时找到一种更好的方法来确定 url 是否被重写。
我有一个 Javascript 应用程序使用 Slim (slimframework.com) 作为 API 端点。
我在以前的电脑 (win 8) 上使用它已经有一段时间了,但是移动了它,现在它在 OSX 上 运行 (Apache 2.4.9 php 5.5 ).
奇怪的是,在这次迁移之后,无论我尝试什么 GET 路由,它们都会路由到 /(默认路由)。当我尝试获取请求的路径时(如您在“/”路径中看到的那样),它显示了正确的请求。
我把它全部拆开并设置了最小的布局。相同的结果。
php:
require 'Slim/Slim.php';
\Slim\Slim::registerAutoloader();
$app = new \Slim\Slim();
$app->get('/hello/:name', function ($name) {
echo "Hello, $name";
});
$app->get('/', function () use ($app) {
echo "root" . $app->request()->getPath();
});
$app->run();
调用 /hello/world 应该 return 字符串 "Hello, world"。但取而代之的是 returns "root /hello/world/" 注意尾部的斜线..这也适用于任何其他路线(即 /hello/world/and/other/planets/as/well returns "root/hello/world/and/other/planets/as/well/").
我想知道这是否与我的虚拟主机配置有关(但我有很多使用 url 重写的应用程序,这似乎有效)
httpd-vhost.conf
<VirtualHost *:80>
ServerName stage_api.loc
ServerAlias stage_api.loc
DocumentRoot "[the correct dir]"
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule (.*) /index.php [L,QSA]
<Directory "[the correct dir]">
Options Indexes FollowSymlinks MultiViews
AllowOverride All
Require all granted
</Directory>
</VirtualHost>
奇怪的是,如果我从 vhost 配置中省略 FollowSymLinks,整个过程就会失败。
我在这里遗漏了什么?任何帮助表示赞赏。
B
更新: 害怕被视为轻微强迫症...但我添加了 print_r($_SERVER);到 index.php,一切似乎都是正确的
Array
(
[SCRIPT_URL] => /hello/world
[SCRIPT_URI] => http://stage_api.loc/hello/world
[HTTP_HOST] => stage_api.loc
[HTTP_CONNECTION] => keep-alive
[HTTP_CACHE_CONTROL] => no-cache
[HTTP_USER_AGENT] => Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.99 Safari/537.36
[HTTP_ACCEPT] => */*
[HTTP_ACCEPT_ENCODING] => gzip, deflate, sdch
[HTTP_ACCEPT_LANGUAGE] => en,en-US;q=0.8,nb;q=0.6
[PATH] => [removed by user]
[SERVER_SIGNATURE] =>
[SERVER_SOFTWARE] => Apache/2.4.9 (Unix) OpenSSL/0.9.8za PHP/5.5.14
[SERVER_NAME] => stage_api.loc
[SERVER_ADDR] => 127.0.0.1
[SERVER_PORT] => 80
[REMOTE_ADDR] => 127.0.0.1
[DOCUMENT_ROOT] => [removed by user]
[REQUEST_SCHEME] => http
[CONTEXT_PREFIX] =>
[CONTEXT_DOCUMENT_ROOT] => [removed by user]
[SERVER_ADMIN] => you@example.com
[SCRIPT_FILENAME] => [removed by user]/index.php
[REMOTE_PORT] => [removed by user]
[GATEWAY_INTERFACE] => CGI/1.1
[SERVER_PROTOCOL] => HTTP/1.1
[REQUEST_METHOD] => GET
[QUERY_STRING] =>
[REQUEST_URI] => /hello/world
[SCRIPT_NAME] => /hello/world
[PHP_SELF] => /hello/world
[REQUEST_TIME_FLOAT] => 1421675412.017
[REQUEST_TIME] => 1421675412
[argv] => Array
(
)
[argc] => 0
)
所以。使用 Whosebug 作为 rubberduck 我最终想出了一个解决方案(如果有人偶然发现了同样的问题)。
使用重写的 url 时,环境在 Slim 框架中被误解。
必须覆盖 Environment.php 中 属性 的设置(第 143 行)
from:
$env['PATH_INFO'] = substr_replace($requestUri, '', 0, strlen($physicalPath));
to:
$env['PATH_INFO'] = $_SERVER['REQUEST_URI'];
这当然不理想。但是让我起来 运行,同时找到一种更好的方法来确定 url 是否被重写。