我尝试通过.htaccess
文件编辑Web根目录:
RewriteCond %{REQUEST_URI} !newweb/
RewriteRule (.*) /newweb/ [L]
RewriteCond %{REQUEST_FILENAME} !-f
在index.html
代码更改CSS
中,通过基本标记JS
链接
<base href="http://example.com/newweb/">
但Anchror链接不会重定向到example.com/#tag
而是重定向到example.com/newweb#tag
我需要第一个选项才能工作。
...但Anchror链接不会重定向到
example.com/#tag
而是重定向到example.com/newweb#tag
是的,使用base
元素(更正相对 URL(并非没有警告。页面内锚点(如#tag
(是"相对 URL",因此现在它是相对于base
URL 的。
解决此问题的唯一方法是使用指向当前页面/URL 的根相对(或绝对(URL 完全限定您的页面内链接。(这可能会破坏首先使用base
标记作为其他相关 URL 的解决方法的意义。或者首先不要使用指向您的资源/其他页面的相对 URL。
有关更多详细信息,请参阅我对专业网站管理员堆栈上类似问题的回答:
- https://webmasters.stackexchange.com/a/86458/1243
更新:看过你的网站,它本质上是一个依赖片段标识符的单页网站(即。#tag
(,然后您应该将资源(CSS,JS和图像(的所有相对URL更改为根相对(以斜杠开头(并删除base
元素。
通过"根相对",它应该是相对于预期的客户端根目录的根目录,而不是实际的文件系统根目录。
例如,HTML 源中的以下相对 URL:
vendor/bootstrap/css/bootstrap.min.css
应更改为根相对 URL(而不是文件系统路径(:
/vendor/bootstrap/css/bootstrap.min.css
请注意,这不包括/newweb
文件系统子目录。
然后,.htaccess
中的指令在内部重写要/newweb/vendor/bootstrap/css/bootstrap.min.css
的 URL(底层文件系统路径(。然后,/newweb
子目录对客户端完全隐藏。
通过在 HTML 中使用base
标记,您还将/newweb
子目录暴露给客户端(和搜索引擎(,并可能创建重复的内容,因为您的网站在example.com/
和example.com/newweb/
都可用。
RewriteCond %{REQUEST_URI} !newweb/ RewriteRule (.*) /newweb/ [L] RewriteCond %{REQUEST_FILENAME} !-f
但是,这些指令是不正确的。您的.htaccess
文件中还有其他指令吗?最后一个RewriteCond
指令在最后本身无效。前面的RewriteRule
重写了目录根目录的所有内容(这可以解释为什么您在 HTML 源代码中使用相对 URL?
要将所有内容重写为/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/?(.*) /$1 [R=302,L]
# Rewrite enverything to the /newweb subdirectory
RewriteRule !^newweb/ /newweb%{REQUEST_URI} [L]
仅当确认302(临时(恢复正常时,才将其更改为 301(永久(。