使用 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>
我有一个 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>