虽然我设置了一些.htaccess文件,但我没有使用虚拟主机或任何花哨的东西。以下是我在httpd.conf中的重写规则:
RewriteEngine On
RewriteCond %{REQUEST_URI} !^/app/smsapi [NC]
RewriteRule (.*) https://www.example.com/uri=%{REQUEST_URI} [R,L]
此规则基本上表示如果uri 不以/ app / smsapi开头,则触发重写。但是,当我重新启动服务器并尝试它时,我得到了一些奇怪的结果。
当我请求网址https://www.example.com/app/smsapi/index.php时,我获得了200个成功代码,这是预期的。但是,当我请求网址http://www.example.com/app/smsapi/index.php时,它会重定向到https://www.example.com/uri=/app/smsapi/index.php。因此,即使请求URI不满足条件,它实际上也会触发规则。
所以,然后我决定关闭重写规则并试一试。现在,这两个URL都给了我200个成功代码。
现在,我知道其他无法访问服务器的人无法轻易解决这个问题,但我是否正确地说这是当然 REQUEST_URI未正确触发的问题?我已经证明,没有重写规则,一切正常,但是使用重写规则,第二个URL被重定向。因此,重定向必须由重写规则引起?此外,不满足重定向规则的条件。这不能证明重写规则的功能有问题吗?
还有其他可能吗?
更新 这里发生了一些非常奇怪的事情。我设置了一个本地服务器并尝试了相同的规则,我为URL http://192.168.0.112/app/获得的是
这是正确的,因为只要URL不像/ app / smsapi,它就应该重定向它。不知道为什么在真实服务器上没有发生这种情况。此外,您插入这些规则似乎有所作为。 (我只在LoadModule命令之后包含这些规则。)
在localhost上,如果我将这些规则放在“目录”部分的上方或下方,它就不会起作用。但是,如果我将包含在内部目录部分中,它将会。
在服务器上,如果我在“目录”部分中包含规则,那么它们将无法正常工作。但是,如果我将它们包含在目录部分的上方或下方,它们就会开始工作。
在我看来,这是由于版本的差异。我的localhost是运行Apache 2.4.18的Ubuntu Desktop 16.04。服务器是运行Apache 2.2.15的CentOS 6.8。
但是,我认为关于为什么服务器重定向只发生一次(虽然配置为最多20次)的问题与https有关。这也与原始问题有关,即使在非匹配规则上也重定向https。
线索任何人?
更新 我使用相同的规则更新了httpd.conf文件但我使用了http://而不是https://它给了我20个重定向的正确结果。这意味着我已将问题隔离到https。
答案 0 :(得分:2)
您正在报告第一句中的确切问题:"我没有使用虚拟主机或任何花哨的东西虽然我有一些.htaccess文件设置"
.htaccess是" fancy"并且过于复杂,而不是虚拟主机。
如果您首先在虚拟主机中定义了RewriteCond,那么它将起作用,但.htaccess是per-dir context(又名噩梦),而正则表达式^ /将永远不会在该上下文中匹配
如果要在per-dir上下文(目录或.htaccess)中匹配REQUEST_URI,则需要删除初始斜杠,即:
RewriteCond %{REQUEST_URI} !^app/smsapi [NC]
额外的,还要考虑你可能不需要为此添加RewriteCond:
RewriteRule ^(?!app/smsapi)(.*) https://www.example.com/uri=$1 [R,L]