使用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的新手,我真的很难过。
答案 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的人