.htaccess htaccess重写器规则生成多个错误匹配副本

mwg9r5ms  于 2022-11-16  发布在  其他
关注(0)|答案(1)|浏览(144)

尝试使用使用.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

mnemlml8

mnemlml81#

RewriteCond指令只应用于紧随其后的 * 单个 * RewriteRule。这意味着您的 * 第二个 * RewriteRule * 没有 * 被任何RewriteCond覆盖。这意味着它会创建一个无休止的重写循环。
你想拒绝它,指出你重写到/bar.php,它可能没有被匹配的模式匹配 * 再次 *,但是...
事实并非如此。仔细看看你的规则:

RewriteRule ^bar/?([^/]*)/?$  /bar.php?s=$1 [NC,END,R=301,QSA]

匹配模式使用/?,这使得斜杠 * 是可选的 *。所以bar.php?s=whatever是 * 再次 * 匹配的。在下一轮重写引擎这样做。
解决方法:
1.将条件应用于 * 两个 * 规则和
1.请使用适当的匹配模式。
其实我不知道你想用那些模式匹配什么...为什么是/?

  • 您是否尝试以这种方式匹配查询字符串?这是行不通的,您需要另一个RewriteCond来对%{QUERY_STRING}应用匹配模式。实际上,这是有文档记录的。
  • 或者你是想在/baroptional 之后做什么吗?那就用^/?bar(/[^/]*)?/?$这样的模式吧...

相关问题