使用 Angular 应用程序重写 Apache 通配符子域

Apache wildcard subdomain rewrite with Angular app

我有一个 Angular 应用需要 运行 在子域下以支持多租户。每个子域都是应用程序下的不同租户。 现在我有当前的 .htaccess 设置,可以(仅)加载主页,但实际 Angular 路由根本不起作用。

当前的 .htaccess 如下所示:

# BEGIN WordPress
# The directives (lines) between `BEGIN WordPress` and `END WordPress` are
# dynamically generated, and should only be modified via WordPress filters.
# Any changes to the directives between these markers will be overwritten.
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>

# END WordPress

RewriteEngine On
RewriteBase /manager
RewriteCond %{HTTP_HOST} !^www\.domain\.io
RewriteCond %{HTTP_HOST} ([^.]+)\.domain\.io [NC]
RewriteCond %{REQUEST_URI} !manager/
RewriteRule (.*) /manager/%{REQUEST_URI} [L]

主域上还有一个 WP 站点,因此是 WordPress 条目。

我想要实现的是,每当有人去 SUBDOMAIN.domain.io 时,它会从 /manager 文件夹加载文件而不重写地址,然后允许 angular 路由工作,所以当有人转到 subdomain.domain.io/admin 它将加载 angular 路线。

这可能吗?如果是,那么有人可以提出解决方案吗?谢谢!

您完整的 .htaccess 可能是这样工作的:

RewriteEngine On
RewriteBase /

RewriteCond %{HTTP_HOST} ^(?!www\.)[^.]+\.domain\.io$ [NC]
RewriteRule !^manager/ manager%{REQUEST_URI} [L,NC]

RewriteRule ^(index\.php$|manager/) - [L,NC]

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . index.php [L]

在 WP 前端控制器规则之前放置 manager 规则很重要。

  • (?!www\.) 是一个否定前瞻,如果主机名以 www..

    开头,则匹配失败
  • RewriteRule !^manager/ manager/%{REQUEST_URI} [L,NC] 仅当 URI 不以 /manager/

    开头时才会执行

你在官方文档中检查过这个问题了吗? https://angular.io/guide/deployment#server-configuration - 有一些示例(包括 apache)说明路由应用程序必须如何回退到 index.html。 这也是我在我的一个应用程序中使用的另一个 .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>