【问题标题】:Using htaccess rewrite to make a subdirectory be its own root for root relative path requests使用 htaccess rewrite 使子目录成为根相对路径请求的根目录
【发布时间】:2011-02-28 06:14:13
【问题描述】:

我可以使用 htaccess 来捕获来自某个子目录的请求,并使该目录将其自身用作任何根相对路径请求的根目录吗?例如,如果我有...

http://www.example.com/subFIXED/subANY/restofpath

...其中 subFIXED 始终是同一个目录,subANY 是 subFIXED 的任何直接子目录,并且我希望从 subANY 下的任何文件重定向所有 href/src 请求以使用 subANY 作为“根”(有点像一个子域),实际上有根级别的请求使用它作为根目录级别:

http://www.example.com/subFIXED/subANY/

而不是这个:

http://www.example.com/

我假设我可以在 subFIXED 中放置一个 htaccess 文件来处理来自任何 subANY 下的任何内容的所有调用,但对 htaccess 重写、变量等不太熟悉,我不知道如何捕获哪个subANY 目录正在发出根级别请求,然后使用该捕获进行重写以将该目录视为来自它的任何根相对路径请求的根级别。

感谢您的帮助

【问题讨论】:

  • 不幸的是,根据我对 元素的理解,它不会重定向根相对路径(只是相对路径)。所以这不是一个选择。

标签: html url .htaccess mod-rewrite subdirectory


【解决方案1】:

嗯,.htaccess?它将不得不依赖极其不可靠的 HTTP_REFERER,不,谢谢。

在您的 HTML 中添加一个 元素并完成。 http://www.w3schools.com/tags/tag_base.asp


编辑:相对于根目录(“/foo”)也应考虑在内,因此在使用 修复相对路径后:

.htaccess(非常不可靠,因为切换子路径几乎是不可能的,而且 HTTP_REFERER 非常不可靠。简而言之:不要使用)

RewriteCond %{HTTP_REFERER} ^.*://[^/]+/subFIXED/([^/]+)/
RewriteCond %{REQUEST_URI}  !^/subFIXED
RewriteRule ^(.*)$ /subFIXED/%1/$1 [R=301,L,QSA] //drop the R=301 if POSTing, but url will not show the 'correct' one in that case

陷阱:

  1. POST 很尴尬(无法重定向和保留 POST,因此必须“正常”着陆,这会使后续请求中的 REFERER 无用/错误
  2. 通常不发送推荐人
  3. 发送 REFERER 时,无法从任何其他“subAny”切换到其他“subAny”

更多可行的解决方案:

  1. 在服务器上使用脚本对每个请求进行后处理,为每个以“/”开头的引用 (href/src) 添加一个点 (.)。
  2. 前一个可以使用客户端 javascript 完成,但不建议这样做,因为禁用 js 的搜索机器人和浏览器的所有链接都会中断
  3. 创建一个实际的子域,这只是一个麻烦。

简而言之,除了制作实际的子域之外,没有理想的解决方案。您需要这个“固定根路径”解决方案的确切问题是什么?可能还有其他人不涉及这么多麻烦。

【讨论】:

  • 我以前从未见过那个标签——太棒了。你不知道有什么方法可以让它只适用于图像吗?
  • 不幸的是,根据我对 元素的理解,它不会重定向根相对路径(只是相对路径)。所以这不是一个选择。
  • 1) 感谢您抽出宝贵时间。 2)此时创建子域不是一个选项。 3) 在“subANY”和 SEO 之间切换是一个问题(见下文)。问题:即使它是来自我域上的文件的请求,http_referer 仍然不可靠?为了回答您,我想向客户发送一个指向其 subANY 索引的链接,以便他们审查网站设计的各个方面。我希望他们的导航、css、图像等(根相关)链接在他们的“子域”中工作。每个设置都是临时的,subANY 将更改名称(基于客户端)。是否有 PHP 解决方案?
  • 我刚刚测试了你的代码,好消息是我已经进入了页面(不像我之前尝试自己重写的一些尝试);坏消息是它不起作用(我的测试是一个指向 subANY 文件夹下的 css 文件的链接标签,其根路径为“/css/Style.css”,如果重定向正常,它应该会改变我的文本颜色)。
  • 现在很少有子域不是一个选项,更多的是 90 年代的东西,但还可以。是的,如果每个 HTML 页面都使用 PHP,您可以使用 ob_start() 缓冲输出,并在请求结束时在 ob_get_clean() 中捕获输出,之后您可以使用 rehular 搜索前导 '/' 喜欢表达式,或将 HTML 加载到 DOMDocument 之类的内容中,然后使用 DOMXPath 进行搜索,添加点并输出。您甚至可以使用 auto_prepend 和 auto_append php 设置将该代码放在单独的文件中,而不是在您的代码库中。
猜你喜欢
  • 2016-06-25
  • 1970-01-01
  • 2013-10-02
  • 2011-12-19
  • 2017-03-24
  • 2013-03-11
  • 2017-12-09
  • 2023-03-05
  • 1970-01-01
相关资源
最近更新 更多