更改网站根目录 - 锚链接问题
Change web root directory - problem with anchor links
我尝试通过 .htaccess
文件编辑网站根目录:
RewriteCond %{REQUEST_URI} !newweb/
RewriteRule (.*) /newweb/ [L]
RewriteCond %{REQUEST_FILENAME} !-f
并在 index.html
中更改代码 CSS
、JS
通过基本标签链接
<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
指令最后本身是无效的。前面的 RewriteRule
将 everything 重写到目录根目录(这可以解释为什么你在 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(永久)。
我尝试通过 .htaccess
文件编辑网站根目录:
RewriteCond %{REQUEST_URI} !newweb/
RewriteRule (.*) /newweb/ [L]
RewriteCond %{REQUEST_FILENAME} !-f
并在 index.html
中更改代码 CSS
、JS
通过基本标签链接
<base href="http://example.com/newweb/">
但锚链接不会重定向到 example.com/#tag
而是重定向到 example.com/newweb#tag
我需要第一个选项才能工作。
...but anchror links not redirect to
example.com/#tag
but toexample.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
指令最后本身是无效的。前面的 RewriteRule
将 everything 重写到目录根目录(这可以解释为什么你在 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(永久)。