使用.htaccess传递多个参数

时间:2014-07-26 21:49:42

标签: .htaccess

我试图使用我的.htaccess传递id和模式。目前它传递了一个id,看起来像这样:

RewriteEngine On
RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_URI} .*/([0-9]+)/?$
RewriteRule .* /listing.php?id=%1 [L,QSA]

链接如下所示:

http://www.drlistings.com/villas/stunning_180_degree_ocean_view/4074/

我想添加一个模式,例如:

http://www.drlistings.com/villas/stunning_180_degree_ocean_view/4074/inline

传递

listing.php?id=%1&mode=%2

我已经检查了其他发布的问题,但他们似乎比我正在做的事情复杂得多。第二个参数不必是数字,但如果它更容易做数字,我可以使用它。它可以在id参数之前或之后,我是灵活的,例如:

http://www.drlistings.com/villas/stunning_180_degree_ocean_view/inline/4074/

或如果它是数字,那将是0/1标志情况:

http://www.drlistings.com/villas/stunning_180_degree_ocean_view/0/4074/

谢谢!

1 个答案:

答案 0 :(得分:1)

您的初始规则可能应该简化为处理RewriteRule而不是RewriteCond中的匹配,因为这将是更常规的用法。只是为了纠正您现有的规则,请使用

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
# Match the number in $1 from the RewriteRule's left side
RewriteRule ^.+/([0-9]+)$ /listing.php?id=$1 [L,QSA]

要选择性地将模式作为id后面的字母数字字符串接受,您可以添加一个非捕获组(?:),其中嵌套了常规捕获组,这将将模式填充到$2中。通过?结束整个事物是可选的。然后将/?附加到末尾,允许可选的尾随/

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^[^/]+/([0-9]+)(?:/([a-z0-9]+))?/?$ /listing.php?id=$1&mode=$2 [L,QSA]

打破它:

  • ^[^/]+匹配字符串的开头,直到第一个/
  • ([0-9]+)将数字ID捕获到$1
  • (?: )?是一个非结束?可选的非捕获组,需要允许可能缺少模式
  • ([a-z0-9]+)将字母数字模式与$2
  • 相匹配
  • /?可选的尾部斜杠
  • $字符串的结尾。