htaccess 隐藏子目录而不更改基本根目录,但另一个子目录除外

htaccess to hide subdirectory without changing base root, and with exception of another subdirectory

我有一个网站https://example.com

其中有 2 个子目录,https://example.com/adminhttps://example.com/store

  1. 我想从 URL 隐藏 /store 所以我的请求看起来像: https://example.com/shop.php?id=someid
  2. 而且,我希望 https://example.com/admin/index.php 能正常工作。
  3. 我找到了一些同时实现 1 和 2 的答案,但它们改变了基根,所以我所有的 css、js、图像都不会加载

到目前为止我有:

RewriteCond %{HTTP_HOST} ^(www\.)?example.com$
RewriteRule ^store/(.*) / [L,R=301]
RewriteCond %{HTTP_HOST} ^(www\.)?example.com$
RewriteRule !^store/ store%{REQUEST_URI} [L]

这实现了 1 而不是 2。

RewriteCond %{HTTP_HOST} ^(www\.)?example.com$
RewriteRule ^store/(.*) / [L,R=301]
RewriteCond %{HTTP_HOST} ^(www\.)?example.com$
RewriteRule !^store/ store%{REQUEST_URI} [L]

在第二条规则中...排除 RewriteRule 模式 中的 /admin 子目录(以及 /store)。并添加 条件 以排除包含文件扩展名的请求(即 .css.js.png 等)。例如:

RewriteCond %{HTTP_HOST} ^(www\.)?example.com$
RewriteCond %{REQUEST_URI} !\.\w{2,4}$
RewriteRule !^(store|admin)($|/) store%{REQUEST_URI} [L]

或者(虽然效率稍低),排除任何已经映射到物理文件的请求:

RewriteCond %{HTTP_HOST} ^(www\.)?example.com$
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule !^(store|admin)($|/) store%{REQUEST_URI} [L]

此规则假定您在 /store 子目录中还有另一个 .htaccess 文件,该文件也使用重写引擎。 (但如果是这种情况,那么第一条规则实际上没有做任何事情。)

除非您托管多个 domains/sites,否则您不需要第一个条件来检查所请求的 Host