尽管未指定重定向并且.htaccess中的条件不满足,但仍发生301重定向

时间:2018-07-13 12:05:26

标签: apache .htaccess redirect

我使用.htaccess文件来简化我的域的网址。我有一条规则,如果还没有一个规则的话,它会在网址末尾添加一个斜杠:

RewriteCond %{REQUEST_URI} !(/$)
RewriteRule (.*) %{REQUEST_URI}/ [R=301,L]

因此,我将R=301放在最后,以便将其重定向到新的url,以便用户可以看到此更改。然后,下一行将搜索特定的模式,以将其重写为适当的url格式,例如:

RewriteRule ^account/([A-Za-z0-9-]+)/?$ /account.php?prefix=$1 [NC,L]

所以这个想法是,如果这个URL被调用:

http://example.com/account/user123

然后,它首先发送“ 301”重定向到:

http://example.com/account/user123/

,然后发送“ 200”并将内部重写到:

 http://example.com/account.php?prefix=user123

我遇到的问题是由于某种原因,它首先添加了没有问题的斜杠,然后将301返回到带有斜杠的新网址,然后又再次调用301来重定向浏览器:

http://example.com/account.php?prefix=user123

我不明白为什么会这样做,因为处理此问题的RewriteRule的末尾有L并且不包含R,所以据我所知仅在内部重写url,而不发送重定向到客户端。

因此很明显,在诉诸此问题之前,我做了一些错误修复,然后发现如果我注释掉添加斜杠的代码行:

#RewriteCond %{REQUEST_URI} !(/$)
#RewriteRule (.*) %{REQUEST_URI}/ [R=301,L]

我知道问题一定在这里,因为没有规范,.htaccess将返回302而不是301,但是第二次重写不包含该规范。因此,第二次重写以某种方式从上一行调用R=301,尽管该行不匹配。

我不知道这里出了什么问题,我对问题的分析可能是错误的。我对这里发生的事情完全感到困惑,请帮助XD

1 个答案:

答案 0 :(得分:1)

带有301的第一个规则确实匹配,因为account.php不以/结尾。即使在内部重写之后,也会再次处理所有RewriteRules。

如果存在名称相同的文件,则可以在不适用之前添加另一个RewriteCond:

RewriteCond %{REQUEST_FILENAME} !-f