更改Web根目录-锚链接问题

时间:2018-10-26 10:50:15

标签: .htaccess web root

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

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

我需要第一种选择。

1 个答案:

答案 0 :(得分:0)

  

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

是的,使用base元素(更正相对URL)并非没有警告。页内锚点(例如#tag)是“相对URL”,因此现在相对于base URL。

解决此问题的唯一方法是完全限定您的页内链接,并使用指向当前页面/ URL的相对根(或绝对)URL。 (这可能会打败首先使用base标签作为您 other 相对URL的解决方法的观点。)或者不要在您的资源/其他页面中使用相对URL第一名。

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


更新:浏览了您的网站,该网站本质上是一页纸的网站,它依赖于所有页内链接的片段标识符(即#tag),然后您应该将资源的所有 relative URL(CSS,JS和图像)更改为根目录(以斜杠开头),并删除base元素。

通过“相对于根”,它应相对于您的预期客户端根,而不是实际文件系统根。

例如,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子目录暴露给客户端(和搜索引擎),并可能创建重复的内容,因为您的网站在{{1 }}和example.com/

example.com/newweb/

但是,这些指令不正确。您的RewriteCond %{REQUEST_URI} !newweb/ RewriteRule (.*) /newweb/ [L] RewriteCond %{REQUEST_FILENAME} !-f 文件中是否还有其他指令?最后的.htaccess指令最后本身是无效的。并且前面的RewriteCond所有内容重写到目录根目录(这可能解释了为什么您诉诸于在HTML源代码中使用相对URL的原因?)

要将所有内容重写为RewriteRule子目录中的相应URL,那么您将需要以下内容:

/newweb

这假定您的页面仅引用RewriteEngine On # Rewrite enverything to the /newweb subdirectory RewriteRule !^newweb/ /newweb%{REQUEST_URI} [L] 子目录中包含的资源,而不引用文件系统上的其他资源。如果是,那么还需要检查文件系统。

但是,就其本身而言,这不能解决/newweb仍可访问的问题(尽管由于URL路径不公开,所以此重要性不那么重要)。可以通过从example.com/newweb/回到文档根目录的外部重定向来解决此问题(但考虑到相反的重写方向,我们需要注意重定向循环)。

因此,请尝试以下操作:

/newweb

仅在确认正常工作后,才将302(临时)目录更改为301(永久目录)。