更改网站根目录 - 锚链接问题

Change web root directory - problem with anchor links

我尝试通过 .htaccess 文件编辑网站根目录:

RewriteCond %{REQUEST_URI} !newweb/
RewriteRule (.*) /newweb/ [L]
RewriteCond %{REQUEST_FILENAME} !-f

并在 index.html 中更改代码 CSSJS 通过基本标签链接

<base href="http://example.com/newweb/">

但锚链接不会重定向到 example.com/#tag 而是重定向到 example.com/newweb#tag

我需要第一个选项才能工作。

...but anchror links not redirect to example.com/#tag but to example.com/newweb#tag

是的,使用 base 元素(以更正相对 URLs)并非没有警告。 #tag 等页内锚点是 "relative URL",因此现在它是相对于 base URL.

解决这个问题的唯一方法是完全限定您的页内链接,使用根相对(或绝对)URL 到当前 page/URL。 (这可能会破坏首先使用 base 标记作为 other 亲戚 URLs 的变通方法的意义。)或者不要使用 relative URL首先转到您的资源/其他页面。

有关详细信息,请参阅我对 a similar question on the Pro Webmasters stack 的回答:


更新: 看过您的网站,该网站本质上是一个单页网站,所有内容都依赖片段标识符(即 #tag) -page 链接然后你应该将所有 relative URLs 更改为你的资源(CSS,JS 和图像)是根相对的(以斜杠开头)并删除 base 元素。

根据 "root-relative",它应该是相对于您的 预期 客户端根目录的根目录,而不是实际的文件系统根目录。

例如,您的 HTML 来源中的以下亲属 URL:

vendor/bootstrap/css/bootstrap.min.css

应更改为根目录相对 URL(不是文件系统路径):

/vendor/bootstrap/css/bootstrap.min.css

请注意,这不包括 /newweb 文件系统子目录。

.htaccess 中的指令然后 在内部将 URL 重写为 /newweb/vendor/bootstrap/css/bootstrap.min.css(底层文件系统路径)。 /newweb 子目录对客户端完全隐藏。

通过在 HTML 中使用 base 标记,您还向客户端(和搜索引擎)公开了 /newweb 子目录并可能创建重复内容,因为您的站点是example.com/example.com/newweb/.

均可用
RewriteCond %{REQUEST_URI} !newweb/
RewriteRule (.*) /newweb/ [L]
RewriteCond %{REQUEST_FILENAME} !-f

但是,这些指令是不正确的。您的 .htaccess 文件中是否还有其他指令?最后一个 RewriteCond 指令最后本身是无效的。前面的 RewriteRuleeverything 重写到目录根目录(这可以解释为什么你在 HTML 源代码中使用相对 URLs?)

要将所有内容重写到 /newweb 子目录中相应的 URL,那么您需要这样的东西:

RewriteEngine On

# Rewrite enverything to the /newweb subdirectory
RewriteRule !^newweb/ /newweb%{REQUEST_URI} [L]

这假定您的页面仅引用包含在 /newweb 子目录中的资源,而不引用文件系统中其他地方的资源。如果是,那么您还需要检查文件系统。

然而,就其本身而言,这并不能解决 example.com/newweb/ 仍然可访问的问题(尽管现在 URL 路径未公开,这已经不那么重要了)。这可以通过从 /newweb 返回到文档根目录的外部重定向来解决(但我们需要注意重定向循环,因为在相反方向重写)。

因此,请尝试以下操作:

RewriteEngine On

# If /newweb is requested directly then redirect to remove it
RewriteCond %{REDIRECT_STATUS} ^$
RewriteRule ^newweb/?(.*) / [R=302,L]

# Rewrite enverything to the /newweb subdirectory
RewriteRule !^newweb/ /newweb%{REQUEST_URI} [L]

只有当您确认它工作正常时,才将 302(临时)重定向更改为 301(永久)。