我如何编写一个 Zend Framework 应用程序来直接处理请求(将 URL 映射到文件)?
How can I write a Zend Framework App that serves requests directly (maps URLs to files)?
背景:我有一个按原样提供文件的旧版应用程序。也就是说,当我转到 http://server/subfolder/my_index.php?value=x
时,它会进入文件系统上的 subfolder
并提供一个名为 my_index.php
的文件并将其传递给 URL 参数和 returns 回复。
我想移动到 ZF3 堆栈,那里的路由不同。我想为 ZF3 上的新模块保留 ZF 路由模型,但也能够按原样使用旧版应用程序,因为重写该应用程序是禁止的。
有办法吗?
不确定是否是这样做的方式,但我在这里查看了中间件层:
- https://docs.zendframework.com/zend-mvc/middleware/ 和
- https://zendframework.github.io/zend-diactoros/usage/
我不清楚如何使用它们以及它们是否对我有帮助。
例如,我设置了这个 class,但不确定接下来要做什么。
namespace Application\Middleware;
use Psr\Http\Message\ServerRequestInterface;
use Interop\Http\ServerMiddleware\MiddlewareInterface;
use Interop\Http\ServerMiddleware\DelegateInterface;
use Zend\Http\Response;
class IndexMiddleware implements MiddlewareInterface
{
public function process(ServerRequestInterface $request, DelegateInterface $delegate)
{
$response = new \Zend\Diactoros\Response();
return $response;
}
}
如果你看看你的 .htaccess
或你的 Nginx 配置,你会在 ZF3 项目中有类似的东西:
RewriteEngine On
# The following rule tells Apache that if the requested filename
# exists, simply serve it.
RewriteCond %{REQUEST_FILENAME} -s [OR]
RewriteCond %{REQUEST_FILENAME} -l [OR]
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule ^.*$ - [L]
# The following rewrites all other queries to index.php. The
# condition ensures that if you are using Apache aliases to do
# mass virtual hosting or installed the project in a subdirectory,
# the base path will be prepended to allow proper resolution of
# the index.php file; it will work in non-aliased environments
# as well, providing a safe, one-size fits all solution.
RewriteCond %{REQUEST_URI}:: ^(/.+)/(.*)::$
RewriteRule ^(.*) - [E=BASE:%1]
RewriteRule ^(.*)$ %{ENV:BASE}/index.php [L]
如果您阅读评论,您会发现文件和目录如果存在则按原样提供。
背景:我有一个按原样提供文件的旧版应用程序。也就是说,当我转到 http://server/subfolder/my_index.php?value=x
时,它会进入文件系统上的 subfolder
并提供一个名为 my_index.php
的文件并将其传递给 URL 参数和 returns 回复。
我想移动到 ZF3 堆栈,那里的路由不同。我想为 ZF3 上的新模块保留 ZF 路由模型,但也能够按原样使用旧版应用程序,因为重写该应用程序是禁止的。
有办法吗?
不确定是否是这样做的方式,但我在这里查看了中间件层:
- https://docs.zendframework.com/zend-mvc/middleware/ 和
- https://zendframework.github.io/zend-diactoros/usage/
我不清楚如何使用它们以及它们是否对我有帮助。
例如,我设置了这个 class,但不确定接下来要做什么。
namespace Application\Middleware;
use Psr\Http\Message\ServerRequestInterface;
use Interop\Http\ServerMiddleware\MiddlewareInterface;
use Interop\Http\ServerMiddleware\DelegateInterface;
use Zend\Http\Response;
class IndexMiddleware implements MiddlewareInterface
{
public function process(ServerRequestInterface $request, DelegateInterface $delegate)
{
$response = new \Zend\Diactoros\Response();
return $response;
}
}
如果你看看你的 .htaccess
或你的 Nginx 配置,你会在 ZF3 项目中有类似的东西:
RewriteEngine On
# The following rule tells Apache that if the requested filename
# exists, simply serve it.
RewriteCond %{REQUEST_FILENAME} -s [OR]
RewriteCond %{REQUEST_FILENAME} -l [OR]
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule ^.*$ - [L]
# The following rewrites all other queries to index.php. The
# condition ensures that if you are using Apache aliases to do
# mass virtual hosting or installed the project in a subdirectory,
# the base path will be prepended to allow proper resolution of
# the index.php file; it will work in non-aliased environments
# as well, providing a safe, one-size fits all solution.
RewriteCond %{REQUEST_URI}:: ^(/.+)/(.*)::$
RewriteRule ^(.*) - [E=BASE:%1]
RewriteRule ^(.*)$ %{ENV:BASE}/index.php [L]
如果您阅读评论,您会发现文件和目录如果存在则按原样提供。