我正在尝试编写一个简单的重写规则,它将会改变:
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/value
为https://example.com/index.php?shortened_url=value
。(假设您已经将应用程序中的 URL 更改为以下形式https://example.com/value
?)
但是,代码看起来好像在做正确的事情,所以我认为这只是你的描述颠倒了。(?)(好奇......人们经常按照你所做的那样描述这一点 - 以相反的顺序 - 好像他们描述的是应用程序中的净结果,而不是指令实际执行的操作。)