尝试使用使用.htaccess规则重写为php参数qrys的prettyURL。
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^foo/?([^/]*)/?([^/]*)/?$ /foo.php?s=$1&c=$2 [NC,END,R=301,QSA]
RewriteRule ^bar/?([^/]*)/?$ /bar.php?s=$1 [NC,END,R=301,QSA]
第一个规则工作正常,但第二个规则生成:https://example.com/bar.php?s=.php&s=.php&s=.php&s=.php&s=.php&s=.php&s=.php&s=.php&s=.php&s=.php&s=.php&s=.php&s=.php&s=.php&s=.php&s=.php&s=.php&s=.php&s=.php&s=.php&s=.php&s=.php&s=.php&s=.php&s=.php&s=.php&s=.php&s=.php&s=.php&s=.php&s=.php&s=.php&s=.php&s=.php&s=.php&s=.php&s=.php&s=45843
来自https://example.com/bar/45843
1条答案
按热度按时间mnemlml81#
RewriteCond
指令只应用于紧随其后的 * 单个 *RewriteRule
。这意味着您的 * 第二个 *RewriteRule
* 没有 * 被任何RewriteCond
覆盖。这意味着它会创建一个无休止的重写循环。你想拒绝它,指出你重写到
/bar.php
,它可能没有被匹配的模式匹配 * 再次 *,但是...事实并非如此。仔细看看你的规则:
匹配模式使用
/?
,这使得斜杠 * 是可选的 *。所以bar.php?s=whatever
是 * 再次 * 匹配的。在下一轮重写引擎这样做。解决方法:
1.将条件应用于 * 两个 * 规则和
1.请使用适当的匹配模式。
其实我不知道你想用那些模式匹配什么...为什么是
/?
?RewriteCond
来对%{QUERY_STRING}
应用匹配模式。实际上,这是有文档记录的。/bar
optional 之后做什么吗?那就用^/?bar(/[^/]*)?/?$
这样的模式吧...