Laravel 如何从子域 URL 中删除“api”前缀

Posted

技术标签:

【中文标题】Laravel 如何从子域 URL 中删除“api”前缀【英文标题】:Laravel How to remove "api" Prefix from subdomain URL 【发布时间】:2018-09-10 22:34:24 【问题描述】:

我创建了一个 Laravel 应用程序,它既是 Web 应用程序,又为 androidios 平台提供 REST API。

我有两个路由文件,一个是 api.php 另一个是 web.php 和 routes\api.php 路由如下:

routes/api.php
    Route::group([
    'domain'=>'api.example.com',
    function()
        // Some routes ....
    
);

和配置的nginx服务块可以在这里看到

server 
listen 80;
listen [::]:80;

root /var/www/laravel/public;
index index.php;
server_name api.example.com;

location / 
    try_files $uri $uri/ /index.php$is_args$args;


location ~ \.php$ 
    include snippets/fastcgi-php.conf;
    fastcgi_pass unix:/var/run/php5-fpm.sock;

我可以使用http://example.com 访问我的应用程序,使用http://example.com 访问我的应用程序,http://api.example.com/api/cities 访问 REST API。但是子域 URL 包含 api 作为前缀,如下所示。

http://api.example.com/api/cities

但我想我的子域像这样http://api.example.com/cities (我想remove 来自子域 URL 的 api 前缀)。

RouteServiceProvide.php 中为 api 路由删除前缀 api 是否正确?

或者他们有什么正确的方法来实现这个吗?

环境细节 Laravel 5.5 (LTS) PHP 7.0

【问题讨论】:

【参考方案1】:

这只是将您的 api 路由与其他路由区分开来的前缀。您可以在此处添加不同于 api 的内容。

app\Providers\RouteServiceProvider改这个函数:

   /**
     * Define the "api" routes for the application.
     *
     * These routes are typically stateless.
     *
     * @return void
     */
    protected function mapApiRoutes()
    
        Route::prefix('api')
             ->middleware('api')
             ->namespace($this->namespace)
             ->group(base_path('routes/api.php'));
    

删除前缀行:

   /**
     * Define the "api" routes for the application.
     *
     * These routes are typically stateless.
     *
     * @return void
     */
    protected function mapApiRoutes()
    
        Route::middleware('api')
             ->namespace($this->namespace)
             ->group(base_path('routes/api.php'));
    

【讨论】:

感谢您的快速回复,上述操作是否正确? 是的,这是正确的方法。我认为没有为子域创建默认 api 路由。因为他们添加了 api 前缀来区分 api 路由与您的 web 或管理路由。 如果我在RoutesServiceProvider中删除了api前缀,会不会和web.php路由冲突? 不,我认为这不会发生。但尽量不要为看起来像 web.php 路由的 api 路由命名。 Laravel sub-domain routing 在这种情况下会有所帮助吗?【参考方案2】:

实际上在 Laravel 8 中,我只是从 App/Providers/RouteServiceProvider.php 的前缀中删除 api

Route::prefix('api')
            ->middleware('api')
            ->namespace($this->namespace)
            ->group(base_path('routes/api.php'));

Route::prefix('/')
            ->middleware('api')
            ->namespace($this->namespace)
            ->group(base_path('routes/api.php'));

【讨论】:

为什么要复制原来的答案?

以上是关于Laravel 如何从子域 URL 中删除“api”前缀的主要内容,如果未能解决你的问题,请参考以下文章

Laravel 7.x - 如何从 URL 中删除“公共”?

Laravel 本地子域 url 调用

如何从 laravel 5 中的 url 中删除 public/index.php?

如何以正确的方式从 laravel 5 url 重写或删除 public?

.htaccess 影响子域中的目录

laravel api 子域映射