- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我在 .htaccess
文件中重写规则时遇到了这个非常烦人的问题。
所以我想要的是将这两种类型的 URL 重写到不同的目标:
URL 1 -- http://example.com/rem/call/answer/{Hex String}/{Hex String}/
URL 2 -- http://example.com/answer/{Hex String}/{Hex String}/
这是我的 .htaccess 文件的摘录:
RewriteEngine On
RewriteRule rem/call/answer/([a-f0-9]+)/([a-f0-9]+)/?$ /TARGET1
RewriteRule answer/([a-f0-9]+)/([a-f0-9]+)/?$ /TARGET2
现在的问题是 URL 2 重写良好(使用 rule #2)并转到 TARGET 2,但是 URL 1 用两条规则重写,而不仅仅是 rule #1。
我尝试了几种解决方案,包括明显使用字符 ^
来表示 “字符串的开头”。那时,我的重写规则是:
RewriteEngine On
RewriteRule rem/call/answer/([a-f0-9]+)/([a-f0-9]+)/?$ /TARGET1
RewriteRule ^answer/([a-f0-9]+)/([a-f0-9]+)/?$ /TARGET2
然而,另一个问题发生了。这次是 URL 1 重写得很好,只有 rule #1 并转到 TARGET 1。但是现在 URL 2 不再重写了。我猜这是因为第二个重写规则从不匹配任何 url,因此从不应用。
到目前为止,我找到的唯一解决方案是删除 ^
并在 rule #1 末尾使用 [L]
标志像这样:
RewriteEngine On
RewriteRule rem/call/answer/([a-f0-9]+)/([a-f0-9]+)/?$ /TARGET1 [L]
RewriteRule answer/([a-f0-9]+)/([a-f0-9]+)/?$ /TARGET2
这样,它使用规则 #1,匹配,但永远不会达到规则 #2。两个 url 都使用这些规则正确重写,但这不是一个好的解决方案,因为我可能不想在第一条规则应用后停止重写 URL 1(如果我有第三条规则我会怎样也想申请...)
既然我已经陈述了问题,我的问题是:
[L]
标志是唯一的出路吗? (我非常怀疑,当然希望不会)^
会是一个候选解决方案吗? (我也这么认为)我怀疑这与 URL 实际上是 http://example.com/answer/{Hex String}/{Hex String}/
而不仅仅是 answer/{Hex String}/{Hex String}/
,这意味着 answer/..
并不是真正在字符串的开头,因此在它前面加上 ^
不起作用。
但这又让我想到了另一个问题:
如何告诉 apache 去除 scheme+domain 部分的 url(即 http://example.com/
)并仅将规则与 url 的其余部分匹配(例如 答案/{十六进制字符串}/{十六进制字符串}/
) ?
我还应该补充一点,我已经尝试过基本的 alice-bob 示例。我的根目录中有一个名为 bob.html 的文件,.htaccess
文件中有以下规则:
RewriteRule alice.html$ /bob.html
这工作得很好,并在查询 alice.html 时显示 bob.html 页面。但是,如果我将规则更改为:
RewriteRule ^alice.html$ /bob.html
然后我在查询 alice.html 页面时收到 404 错误...
至于@anubhava的评论,我完整的.htaccess文件组成如下:
RewriteEngine On
[A bunch of RewriteRule that have nothing to do with the topic at hand
(don't contain any "answer" string in them and all work perfectly)]
RewriteRule rem/call/answer/([a-f0-9]+)/([a-f0-9]+)/?$ /TARGET1 [L]
RewriteRule answer/([a-f0-9]+)/([a-f0-9]+)/?$ /TARGET2
ErrorDocument 404 /404.html
Header set Access-Control-Allow-Origin "*"
SetEnv file_uploads On
最佳答案
好的,感谢@anubhava 的评论,我通过将 .htaccess
文件向下移动一级到 www
目录轻松解决了这个问题。
我仍然很好奇为什么这解决了我的问题,所以我继续研究 apache 的重写是如何工作的。我不确定我是否了解了所有细节,但这是我发现的。
当然,不用说文件的位置很重要,尤其是像.htaccess
这样的配置文件。但它甚至超越了简单的文件路径,原因如下:
首先,您需要记住 .htaccess
文件会影响它所在的目录及其所有子目录。因此,将全局 .htaccess
文件放在您网站的根目录下似乎合乎逻辑,因为它会影响所有子目录(即整个网站)。
要记住的第二件事是 public_html
目录(在我的例子中称为 www
,只是指向 public_html 的符号链接(symbolic link)
) 是您网站内容的根文件夹。您可能有权访问其父目录,但无论您放在 public_html
目录之外的内容本身都不是您网站内容的一部分,您放在那里的任何资源都不会成为您网站层次结构的一部分(即无法通过 http://example.com/path/to/resource
) 访问。
正则表达式选项 ^
匹配字符串的开头,这里在 URL 重写的上下文中,它是所考虑的 URL 的开头。这还不是全部,Apache 似乎会根据您的 .htaccess
文件的位置来解析匹配。这意味着 ^
不仅引用了您作为规则的一部分编写的字符串的开头,而且实际上相对于 .htaccess
文件的实际路径引用了它作为该特定 .htaccess
文件中所有重写规则的“本地根目录”。
假设您有一个子目录(例如 http://example.com/sub/directory/
)并且其中有两个文件:
http://example.com/sub/directory/.htaccess
http://example.com/sub/directory/bob.html
在此 .htaccess 文件中,您有如下重写规则:
RewriteRule ^tom.html$ /sub/directory/bob.html
此规则不会匹配http://example.com/tom.html
,因为您可能期望^
起作用,而是会匹配http ://example.com/sub/directory/tom.html
因为这是 .htaccess
文件所在的位置。
一般来说,假设您有一个重写规则,例如:
RewriteRule ^PATH$ /TARGET_PATH
这意味着该规则不会将 URL 与 ^PATH$
匹配,而是实际上将它与 ^[Location of the .htaccess file]/PATH$
匹配>
换句话说,.htaccess
文件的位置充当其中所有重写规则的一种基本 URL(非常类似于 html 中的基本标记)。
这就是为什么我的 ^
重写规则不起作用,因为我的 .htaccess
文件位于 public_html
目录之上,并且该父目录充当我的规则的基本 URL。因此,该规则永远不会匹配任何 URL,因为它将它与从未访问过的路径进行比较(因为在网站的内容根目录之上)。
我希望这足够清楚,可以帮助任何可能遇到我遇到的相同问题的人。
干杯
关于regex - ^ 字符无法在 htaccess 中进行 mod 重写,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32382651/
我通过 spring ioc 编写了一些 Rest 应用程序。但我无法解决这个问题。这是我的异常(exception): org.springframework.beans.factory.BeanC
我对 TestNG、Spring 框架等完全陌生,我正在尝试使用注释 @Value通过 @Configuration 访问配置文件注释。 我在这里想要实现的目标是让控制台从配置文件中写出“hi”,通过
为此工作了几个小时。我完全被难住了。 这是 CS113 的实验室。 如果用户在程序(二进制计算器)结束时选择继续,我们需要使用 goto 语句来到达程序的顶部。 但是,我们还需要释放所有分配的内存。
我正在尝试使用 ffmpeg 库构建一个小的 C 程序。但是我什至无法使用 avformat_open_input() 打开音频文件设置检查错误代码的函数后,我得到以下输出: Error code:
使用 Spring Initializer 创建一个简单的 Spring boot。我只在可用选项下选择 DevTools。 创建项目后,无需对其进行任何更改,即可正常运行程序。 现在,当我尝试在项目
所以我只是在 Mac OS X 中通过 brew 安装了 qt。但是它无法链接它。当我尝试运行 brew link qt 或 brew link --overwrite qt 我得到以下信息: ton
我在提交和 pull 时遇到了问题:在提交的 IDE 中,我看到: warning not all local changes may be shown due to an error: unable
我跑 man gcc | grep "-L" 我明白了 Usage: grep [OPTION]... PATTERN [FILE]... Try `grep --help' for more inf
我有一段代码,旨在接收任何 URL 并将其从网络上撕下来。到目前为止,它运行良好,直到有人给了它这个 URL: http://www.aspensurgical.com/static/images/a
在过去的 5 个小时里,我一直在尝试在我的服务器上设置 WireGuard,但在完成所有设置后,我无法 ping IP 或解析域。 下面是服务器配置 [Interface] Address = 10.
我正在尝试在 GitLab 中 fork 我的一个私有(private)项目,但是当我按下 fork 按钮时,我会收到以下信息: No available namespaces to fork the
我这里遇到了一些问题。我是 node.js 和 Rest API 的新手,但我正在尝试自学。我制作了 REST API,使用 MongoDB 与我的数据库进行通信,我使用 Postman 来测试我的路
下面的代码在控制台中给出以下消息: Uncaught DOMException: Failed to execute 'appendChild' on 'Node': The new child el
我正在尝试调用一个新端点来显示数据,我意识到在上一组有效的数据中,它在数据周围用一对额外的“[]”括号进行控制台,我认为这就是问题是,而新端点不会以我使用数据的方式产生它! 这是 NgFor 失败的原
我正在尝试将我的 Symfony2 应用程序部署到我的 Azure Web 应用程序,但遇到了一些麻烦。 推送到远程时,我在终端中收到以下消息 remote: Updating branch 'mas
Minikube已启动并正在运行,没有任何错误,但是我无法 curl IP。我在这里遵循:https://docs.traefik.io/user-guide/kubernetes/,似乎没有提到关闭
每当我尝试docker组成任何项目时,都会出现以下错误。 我尝试过有和没有sudo 我在这台机器上只有这个问题。我可以在Mac和Amazon WorkSpace上运行相同的容器。 (myslabs)
我正在尝试 pip install stanza 并收到此消息: ERROR: No matching distribution found for torch>=1.3.0 (from stanza
DNS 解析看起来不错,但我无法 ping 我的服务。可能是什么原因? 来自集群中的另一个 Pod: $ ping backend PING backend.default.svc.cluster.l
我正在使用Hibernate 4 + Spring MVC 4当我开始 Apache Tomcat Server 8我收到此错误: Error creating bean with name 'wel
我是一名优秀的程序员,十分优秀!