使用简单重写规则,“请求超出 10 次内部重定向的限制”

使用简单重写规则,“请求超出 10 次内部重定向的限制”

我正在尝试编写一个简单的重写规则,它将会改变:

https://example.com/index.php?shortened_url=value

https://example.com/value

为了实现这一点,我使用以下重写规则:

RewriteEngine On
RewriteRule ^([^/]*)$ /index.php?shortened_url=$1 [L]

但我收到错误:

由于可能的配置错误,请求超出了 10 次内部重定向的限制。

显然,这表明某处存在循环问题,但据我所知,我的规则非常简单,不应该导致任何循环?

答案1

首先,你放错了 RewriteRule 命令的参数,顺序是

RewriteRule WHAT WHERE [OPTIONS] (简化事情的快捷方式 - 请参阅文档)

这里有更多关于 RewriteRule 的信息http://httpd.apache.org/docs/current/mod/mod_rewrite.html

如果我没记错的话,您的规则实际上所做的就是将任意数量的斜线重写为//index.php?shortened_url=$1

因此你的访问https://example.com/将被重定向到长 URL,以及https://example.com/////////

你需要提高一下正则表达式技能——试试这个链接来帮助你https://regexr.com/

最后,您要寻找的规则应该是这样的:

RewriteRule ^/index.php\?shortened_url=(.*)$ https://example.com/$1 [L]

答案2

RewriteRule ^([^/]*)$ /index.php?shortened_url=$1 [L]

这将导致重写循环,因为/index.php?shortened_url=value会被进一步重写/index.php?shortened_url=index.php(一次又一次)。

防止此重写循环的一种方法是仅在没有查询字符串时进行重写(前提是您未将查询字符串用于此 URL 上的其他目的)。例如:

RewriteCond %{QUERY_STRING) ^$
RewriteRule ^([^/]*)$ /index.php?shortened_url=$1 [L]

或者,从RewriteRule 图案。 例如:

RewriteRule ^([^/.]*)$ /index.php?shortened_url=$1 [L]

这里需要注意的是,当在每个目录文件中使用L( last) 标志时,它不会停止所有处理.htaccess。它只是停止当前一轮处理。重写过程实际上会重新开始,直到 URL 保持不变。您需要防止重写的 URL 被进一步重写。

这将改变:

https://example.com/index.php?shortened_url=value

https://example.com/value

bocian85 对您的描述确实有道理,因为您的代码完全相反。您的代码重写https://example.com/valuehttps://example.com/index.php?shortened_url=value。(假设您已经将应用程序中的 URL 更改为以下形式https://example.com/value?)

但是,代码看起来好像在做正确的事情,所以我认为这只是你的描述颠倒了。(?)(好奇......人们经常按照你所做的那样描述这一点 - 以相反的顺序 - 好像他们描述的是应用程序中的净结果,而不是指令实际执行的操作。)

相关内容