Regex 将等号分隔的URL术语重写为查询字符串

Regex 将等号分隔的URL术语重写为查询字符串,regex,apache,.htaccess,mod-rewrite,url-rewriting,Regex,Apache,.htaccess,Mod Rewrite,Url Rewriting,使用mod_rewrite,什么重写规则可以使以下两个示例正常工作 示例#1(一个术语): 示例#2(两个术语): 注意:.htaccess文件位于域根目录的/dir/外部 我已经接近这一点: RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule ^([^/]*)=([^/]*)/?$ index.php?a=$1&b=$2 [L] 但是,要使用示例#1,需要一个尾随“=”

使用mod_rewrite,什么重写规则可以使以下两个示例正常工作

示例#1(一个术语):

示例#2(两个术语):

注意:.htaccess文件位于域根目录的/dir/外部

我已经接近这一点:

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^([^/]*)=([^/]*)/?$ index.php?a=$1&b=$2 [L]
但是,要使用示例#1,需要一个尾随“=”(我希望避免)。我曾尝试将正则表达式中的“=”改为“=?”,使其成为可选的,但尽管它可以工作,例如#1,但失败了,例如#2


谢谢你对我问题的考虑。我不熟悉mod_rewrite和regex,我真的被难倒了。

为什么不创建两个独立的重写规则:

i) 处理示例1的方法-添加检查,确保它不包含等号[因此,您无法将示例2与重写规则1匹配]


ii)另一个涉及示例2的方法我看到两种主要方法:

1.更安全/更容易理解,必要时可扩展制定两条规则:第一条规则将捕获
Thank=stackoverflow
,而第二条规则将只处理
Thank

RewriteEngine On

# do not do anything for already existing files
RewriteCond %{REQUEST_FILENAME} -f [OR]
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule .+ - [L]

# will work with /thanks=stackoverflow
RewriteRule ^([^/=]+)=([^/=]+)/?$ index.php?a=$1&b=$2 [L]
# will work with /thanks
RewriteRule ^([^/=]+)/?$ index.php?a=$1 [L]
2将这两条规则合并为一条规则。在这种情况下,参数
b=
将始终存在,但对于
谢谢
场景,参数将为空:

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^([^/=]+)(=([^/=]+))?/?$ index.php?a=$1&b=$3 [L]

两个都测试过——在我的Apache box上运行良好。

谢谢!你的两个例子在这里也很有效。我非常感谢详细的解决方案;他们帮助我提高了对mod_rewrite的理解。经过数小时对我的问题的抨击,我现在明白了我错在哪里,多亏了你的回答。谢谢你对解决方案的有益见解。我已经接受了LazyOne的答案,因为它包含了工作代码,但您最初帮助我朝着正确的方向前进。
RewriteEngine On

# do not do anything for already existing files
RewriteCond %{REQUEST_FILENAME} -f [OR]
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule .+ - [L]

# will work with /thanks=stackoverflow
RewriteRule ^([^/=]+)=([^/=]+)/?$ index.php?a=$1&b=$2 [L]
# will work with /thanks
RewriteRule ^([^/=]+)/?$ index.php?a=$1 [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^([^/=]+)(=([^/=]+))?/?$ index.php?a=$1&b=$3 [L]