我如何使用 .htaccess 重写将根 URL 重定向到子目录,但在找不到任何内容时也有回退?

How can I use .htaccess rewrite to redirect the root URL to a subdirectory, but also have a fallback when nothing is found?

我正在尝试找到一种解决方案,将根更改为默认为 subdirectory_1,但是当 subdirectory_1 中没有 file/directory 时,将所有请求重定向到 root ]目录。

文件夹

.
├── /subdirectory_1
│   ├── index.html
│   ├── about.html
│   └── ...
├── index.php
└── ...

对我来说,主要目标是在 subdirectory_1 中拥有静态生成的网站,而且在 root 中拥有 CMS(如 Wordpress)(作为某些帖子的管理员,稍后用于 API).

我正在寻找的示例

如果我调用 mysite.com/about 它会从 /subdirectory_1/about.html 打开文件并在 URL mysite.com/about 中显示( 没有 subdirectory_1).

但是如果我调用 mysite.com/contacts 并且 /subdirectory_1 中没有 contacts 文件(或目录),它应该尝试在 root 中打开 /contacts目录

到目前为止,我在 .htaccess 文件中找到并尝试过的是:

RewriteEngine On

# HTTP redirect to HTTPS
RewriteCond %{SERVER_PORT} 80
RewriteRule ^(.*)$ mysite.com/ [R,L,NC]

# ROOT Transfer to subdirectory
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_URI} !^/subdirectory_1 [NC]
RewriteRule ^(.*)$ /subdirectory_1/ [L]

# Redirects index (/) to subdirectory index first
RewriteRule ^(/)?$ subdirectory_1/index.html [L]

# Wordpress config
RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]
RewriteBase /
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]

它几乎可以正常工作,但有时会出现一些奇怪的行为,当我访问某些文件时,它显示整个 URL 和 subdirectory_1。例如,我调用 mysite.com/about,它会打开 mysite.com/subdirectory_1/about,如果我立即再次尝试 mysite.com/about,它会正常打开 mysite.com/about

不知为何不一致:/

也许有更好、更清洁、更可靠的解决方案?或者我只是在 .htaccess 的某处犯了一个错误?

在一位程序员的 Discord 中进行讨论后,我终于找到了一个可行的 解决方案。所以决定分享给大家。

我的新 .htaccess 文件:

RewriteEngine On

RewriteCond %{SERVER_PORT} 80
RewriteRule ^(.*)$ mysite.com/ [R,L,NC]

# Exceptions
# For all Wordpress Admin related links
RewriteCond %{REQUEST_URI} ^/(wp-admin|wp-login)/ [NC]
RewriteRule ^ - [L]

# ensure that all directory requests include a trailing slash
RewriteCond %{REQUEST_URI} /+[^\.]+$
RewriteRule ^(.+[^/])$ %{REQUEST_URI}/ [R,L]

# Make /subdirectory_1 like it was root
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{THE_REQUEST} /subdirectory_1/([^\s]+) [NC]
RewriteRule ^ /%1 [NC,L,R]
RewriteCond %{REQUEST_URI} !^/subdirectory_1
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ /subdirectory_1/ [NC,L,QSA]

# Wordpress config
RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]
RewriteBase /
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]

现在静态生成的网站(在 subdirectory_1 中)工作正常,我仍然可以访问 WordPress。