我在.htaccess
文件中遇到了一个非常烦人的重写规则问题。
背景
我想要让这两种类型的URL重写到不同的目标:
URL 1 -- http://example.com/rem/call/answer/{Hex String}/{Hex String}/
URL 2 -- http://example.com/answer/{Hex String}/{Hex String}/
This is an extract of my .htaccess file:
RewriteEngine On
RewriteRule rem/call/answer/([a-f0-9]+)/([a-f0-9]+)/?$ /TARGET1
RewriteRule answer/([a-f0-9]+)/([a-f0-9]+)/?$ /TARGET2
问题
现在的问题是,URL 2 已经成功重写(使用 规则 #2)并且跳转到了 TARGET 2,但是 URL 1 却同时被两个规则重写,而不仅仅是 规则 #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只使用规则 #1重写了,进入了TARGET 1。但现在URL 2不再重写。我猜测这是因为第二个重写规则从未匹配任何url,因此从未应用过。
到目前为止,我找到的唯一解决方案是删除规则 #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
这样,它使用第一条规则匹配,但从未到达第二条规则。这些规则都可以正确重写url,但这不是一个好的解决方案,因为我可能不想在应用第一条规则后停止重写URL 1(如果我还有第三条规则也要应用到它上面怎么办...)
我的问题
既然我已经阐明了问题,我在这里的问题是:
[L]
标记是唯一的选择吗?(我非常怀疑,当然希望不是)- 是否应该使用
^
?(我认为是的) - 如果是,如何使其工作,为什么在我的情况下根本没有起作用?
我怀疑的问题
我怀疑这与URL实际上是http://example.com/answer/{Hex String}/{Hex String}/
而不仅仅是answer/{Hex String}/{Hex String}/
有关,这意味着answer /..
实际上不在字符串的开头,因此在前面加上^
就无法起作用。
但是又引发了另一个问题:
如何告诉apache去除方案+域部分的url(即http://example.com/
),并仅使用url的其余部分匹配规则(例如answer/{Hex String}/{Hex String}/
)?
编辑
我还应该补充一点,我已经尝试了基本的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
RewriteRule ^answer/(.*)$ /some/path/answer/foo.php
?您的规则目标中是否出现字符串“answer”? - Jon LinRewriteRule ^alice.html$ /bob.html
应该可以工作。难道它不应该在www
目录中吗? - anubhava