我如何使用 .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。
我正在尝试找到一种解决方案,将根更改为默认为 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。