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

时间:2011-08-21 01:10:30

标签: regex apache .htaccess mod-rewrite url-rewriting

使用mod_rewrite,RewriteRule将使以下两个示例正常运行?

示例#1 (一个词):

http://example.net/dir/thanks
-to-
http://example.net/dir/index.php?a=thanks

示例#2 (两个术语):

http://example.net/dir/thanks=stackoverflow
-to-
http://example.net/dir/index.php?a=thanks&b=stackoverflow
  

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

我已经接近了这个:

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

但是,要使用示例#1,需要尾随“=”(我想避免使用)。我试过将“=”改为“=?”在正则表达式中使其成为可选项,但是当它在例如#1中起作用时,它会失败,例如#2。

感谢您对我的问题的任何考虑。我是mod_rewrite和regex的新手,我真的很难过。

2 个答案:

答案 0 :(得分:1)

我看到两种主要方法:

1。如果需要,更安全/更容易理解和扩展。 制定两条规则:第一条将抓住thanks=stackoverflow,而第二条仅适用于thanks

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=将始终存在,但thanks方案将为空:

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

测试了两者 - 在我的Apache盒子上工作正常。

答案 1 :(得分:0)

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

i)负责示例1的人 - 添加了检查,表明它不包含等号[因此您不会将示例2与重写规则1匹配]

ii)另一个照顾例子2的人