我使用.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
答案 0 :(得分:1)
带有301的第一个规则确实匹配,因为account.php
不以/
结尾。即使在内部重写之后,也会再次处理所有RewriteRules。
如果存在名称相同的文件,则可以在不适用之前添加另一个RewriteCond:
RewriteCond %{REQUEST_FILENAME} !-f