.htaccess 根据 HTTPS 下的路由加载不同的 Web 应用程序
.htaccess load different web app depending on route under HTTPS
我正在从事一个由一名软件工程师和一组知道如何使用 Wordpress 的非技术人员共同完成的项目。这意味着平台的一部分是手工制作的,但仍然需要让非软件工程师处理 Wordpress 内容。
我的想法是在我的网络服务器根目录中有两个文件夹,一个名为 /app/ 包含手工代码,另一个名为 /wp/。因此,当 GitHub 管道将新代码发布到 /app/ 时,确保不会触及 /wp/ 中包含 Wordpress 的内容。
我已经通过以下代码强制使用 HTTPS:
RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
它就像一个魅力,如果用户使用 HTTP,则会成功重定向。
现在的问题是,我想为自己“保留”手工平台使用的路由,以防用户没有调用任何这些路由,然后我将球传给 Wordpress。我希望它显示为单个网站,所以我不希望用户加载 /app/appRoute 或 /wp/wpRoute,我希望始终加载 /route1、/route2,而不将子文件夹指定到 URL。
handmade 平台应该有优先级,它使用大约 13 条主要路线(其中一些有子路线),所以我想我可以将它们硬编码到 .htaccess 文件中。如果用户试图加载任何这些路由,那么我想将内容加载到 /app/route,如果不是,我将加载 /wp/route。当然Wordpress有自己的.htaccess文件,平台也有自己的,就是:
RewriteEngine on
RewriteBase /
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
我非常不擅长处理 .htaccess 文件并四处搜索,看来我找不到适合我的场景的解决方案。
我应该在网络服务器根目录中有一个 .htaccess 文件删除 Wordpress 文件吗?
我是否应该有两个 .htaccess,先写 13 条路由,然后最终重定向到 WP .htaccess(甚至可能吗?)?
我是否冒着让用户面临“太多重定向”错误的风险?
这个混合解决方案让我很困惑。有遇到同样情况的人有建议吗?提前谢谢你。
鉴于以下要求:
/app
子目录包含“手工代码”
/wp
子目录包含 WordPress 站点。
/app
或 /wp
都不应出现在可见的 URL 中。
Should I have a single .htaccess
file in the webserver root deleting the Wordpress one?
你可以,但我不会。将 WordPress .htaccess
文件保存在 /wp
子目录中。所有 WordPress 都在 /wp
子目录中。
我会使用 3 个 .htaccess
个文件:
文档根目录中的一个。这管理路由到 /app
或 /wp
(WordPress) 中的“手工代码”。这也应该管理规范重定向(即 HTTP 到 HTTPS and www vs non-www)
/app
子目录中的一个在您的“手工代码”中管理路由。
管理 WordPress 内路由的 /wp
子目录中的一个。
这允许您将“手工代码”和 WordPress 完全分开(在开发方面)。
您的 3 .htaccess
个文件将如下所示:
/.htaccess
# /.htaccess
RewriteEngine On
# HTTP to HTTPS redirect
RewriteCond %{HTTPS} off
RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
# Rewrite specific URLs to "/app" (handmade code)
RewriteRule ^app-route-1$ app/[=10=] [L]
RewriteRule ^app-route-2$ app/[=10=] [L]
etc.
# Rewrite everything else to WordPress
RewriteRule (.*) wp/ [L]
如果有模式,可以组合“对 /app
的特定重写”。请参阅下文有关静态资产的信息。
/app/.htaccess
# /app/.htaccess
RewriteEngine On
# Redirect any direct requests to "/app" back to the root
RewriteCond %{ENV:REDIRECT_STATUS} ^$
RewriteRule (.*) / [R=301,L]
# Front-controller
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . index.php [L]
/wp/.htaccess
# /wp/.htaccess
# Redirect any direct requests to "/wp" back to the root
RewriteCond %{ENV:REDIRECT_STATUS} ^$
RewriteRule (.*) / [R=301,L]
# BEGIN WordPress
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . index.php [L]
</IfModule>
# END WordPress
请注意 RewriteBase
指令和 替换 字符串上的斜杠前缀被明确排除,以避免必须指定 /app
或 /wp
在 .htaccess
文件本身。 (尽管这可能会扰乱 WordPress,但它喜欢(不必要地)使用 RewriteBase
并会尝试覆盖 WP 代码块。)
您无需重复 RewriteEngine
指令,该指令稍后已出现在 WP 代码块中。
不知道你想怎么处理你的静态assets/resources(CSS、JS、图片等)?目前,以上假定您将 link 直接访问 /app
内的资产,即。通过在资产 link 中包含 /app
路径段。例如。 <image src="/app/assets/images/myimage.png">
。使用 WordPress,您可以直接 link(即包含 /wp
前缀)或省略 /wp
,因为无论如何其他所有内容都会重写为 /wp
。
理想情况下,最好从您的资产 link 中省略 /app
和 /wp
,因为您不想不必要地向您的用户公开这些内容,并且否则会使站点依赖于这些父目录。
如果您的“手工代码”对所有资产使用 /assets
,那么您可以在根目录的父 .htaccess
文件中重写这些,然后再自定义路由重写:
# Rewrite "/app" assets
RewriteRule ^(assets)(?:/(.*)|$) app// [L]
这允许您的“手工代码”使用 root-relative URLs 引用资产,就好像应用程序安装在文档根目录中一样。
我正在从事一个由一名软件工程师和一组知道如何使用 Wordpress 的非技术人员共同完成的项目。这意味着平台的一部分是手工制作的,但仍然需要让非软件工程师处理 Wordpress 内容。 我的想法是在我的网络服务器根目录中有两个文件夹,一个名为 /app/ 包含手工代码,另一个名为 /wp/。因此,当 GitHub 管道将新代码发布到 /app/ 时,确保不会触及 /wp/ 中包含 Wordpress 的内容。 我已经通过以下代码强制使用 HTTPS:
RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
它就像一个魅力,如果用户使用 HTTP,则会成功重定向。 现在的问题是,我想为自己“保留”手工平台使用的路由,以防用户没有调用任何这些路由,然后我将球传给 Wordpress。我希望它显示为单个网站,所以我不希望用户加载 /app/appRoute 或 /wp/wpRoute,我希望始终加载 /route1、/route2,而不将子文件夹指定到 URL。 handmade 平台应该有优先级,它使用大约 13 条主要路线(其中一些有子路线),所以我想我可以将它们硬编码到 .htaccess 文件中。如果用户试图加载任何这些路由,那么我想将内容加载到 /app/route,如果不是,我将加载 /wp/route。当然Wordpress有自己的.htaccess文件,平台也有自己的,就是:
RewriteEngine on
RewriteBase /
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
我非常不擅长处理 .htaccess 文件并四处搜索,看来我找不到适合我的场景的解决方案。 我应该在网络服务器根目录中有一个 .htaccess 文件删除 Wordpress 文件吗? 我是否应该有两个 .htaccess,先写 13 条路由,然后最终重定向到 WP .htaccess(甚至可能吗?)? 我是否冒着让用户面临“太多重定向”错误的风险?
这个混合解决方案让我很困惑。有遇到同样情况的人有建议吗?提前谢谢你。
鉴于以下要求:
/app
子目录包含“手工代码”/wp
子目录包含 WordPress 站点。/app
或/wp
都不应出现在可见的 URL 中。
Should I have a single
.htaccess
file in the webserver root deleting the Wordpress one?
你可以,但我不会。将 WordPress .htaccess
文件保存在 /wp
子目录中。所有 WordPress 都在 /wp
子目录中。
我会使用 3 个 .htaccess
个文件:
文档根目录中的一个。这管理路由到
/app
或/wp
(WordPress) 中的“手工代码”。这也应该管理规范重定向(即 HTTP 到 HTTPS and www vs non-www)/app
子目录中的一个在您的“手工代码”中管理路由。管理 WordPress 内路由的
/wp
子目录中的一个。
这允许您将“手工代码”和 WordPress 完全分开(在开发方面)。
您的 3 .htaccess
个文件将如下所示:
/.htaccess
# /.htaccess
RewriteEngine On
# HTTP to HTTPS redirect
RewriteCond %{HTTPS} off
RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
# Rewrite specific URLs to "/app" (handmade code)
RewriteRule ^app-route-1$ app/[=10=] [L]
RewriteRule ^app-route-2$ app/[=10=] [L]
etc.
# Rewrite everything else to WordPress
RewriteRule (.*) wp/ [L]
如果有模式,可以组合“对 /app
的特定重写”。请参阅下文有关静态资产的信息。
/app/.htaccess
# /app/.htaccess
RewriteEngine On
# Redirect any direct requests to "/app" back to the root
RewriteCond %{ENV:REDIRECT_STATUS} ^$
RewriteRule (.*) / [R=301,L]
# Front-controller
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . index.php [L]
/wp/.htaccess
# /wp/.htaccess
# Redirect any direct requests to "/wp" back to the root
RewriteCond %{ENV:REDIRECT_STATUS} ^$
RewriteRule (.*) / [R=301,L]
# BEGIN WordPress
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . index.php [L]
</IfModule>
# END WordPress
请注意 RewriteBase
指令和 替换 字符串上的斜杠前缀被明确排除,以避免必须指定 /app
或 /wp
在 .htaccess
文件本身。 (尽管这可能会扰乱 WordPress,但它喜欢(不必要地)使用 RewriteBase
并会尝试覆盖 WP 代码块。)
您无需重复 RewriteEngine
指令,该指令稍后已出现在 WP 代码块中。
不知道你想怎么处理你的静态assets/resources(CSS、JS、图片等)?目前,以上假定您将 link 直接访问 /app
内的资产,即。通过在资产 link 中包含 /app
路径段。例如。 <image src="/app/assets/images/myimage.png">
。使用 WordPress,您可以直接 link(即包含 /wp
前缀)或省略 /wp
,因为无论如何其他所有内容都会重写为 /wp
。
理想情况下,最好从您的资产 link 中省略 /app
和 /wp
,因为您不想不必要地向您的用户公开这些内容,并且否则会使站点依赖于这些父目录。
如果您的“手工代码”对所有资产使用 /assets
,那么您可以在根目录的父 .htaccess
文件中重写这些,然后再自定义路由重写:
# Rewrite "/app" assets
RewriteRule ^(assets)(?:/(.*)|$) app// [L]
这允许您的“手工代码”使用 root-relative URLs 引用资产,就好像应用程序安装在文档根目录中一样。