【问题标题】:Mod Rewrite: Handling two Get VariablesMod Rewrite:处理两个 Get 变量
【发布时间】:2010-05-19 20:40:21
【问题描述】:

如何编辑此 url 重写以包含附加到 URL 的进一步 get 变量?我尝试了几次,但总是收到 500 内部服务器错误!

我添加了 cmets 来展示我想要实现的目标。

# /view.php?user=h5k6&page=1 externally to /h5k6/1
# Some times the page get variable will not exist so it should just show /h5k6
RewriteCond %{THE_REQUEST} ^GET\ /view\.php
RewriteCond %{QUERY_STRING} ^([^&]*&)*user=([^&]+)&?.*$
RewriteRule ^view\.php$ /%2? [L,R=301]

# /h5k6/1 internally to /view.php?t=h5k6&page=1
RewriteRule ^([0-9a-z]+)$ view.php?t=$1 [L]

感谢大家的帮助

【问题讨论】:

  • @Gumbo - 上面没有错误,但是当我编辑 htaccess 文件以包含另一个 get 变量时,我收到一个错误(500 内部服务器错误) - 我希望找到了解如何正确地编辑上述内容以包含两个 GET 变量并像我的 cmets 中一样重写 URL,/h5k66/1。第一段是用户 GET 变量,第二段是页面 GET 变量。
  • @Abs:那你如何尝试包含另一个 GET 参数?
  • 我有一些猜测,我刚刚尝试的最后一个是:^([^&]*&)*user=([^&]+)&?.*$([^&]*&)*page=([^&]+)&?.*$ - 这只是之前获取变量“user”的副本。这没有奏效。
  • @Abs:现在怎么办:它只是不起作用还是导致了内部错误?
  • 通过上述操作,我收到 500 内部服务器错误。如果我删除它,它的罚款。我的两个 get 变量的语法是否正确?

标签: apache mod-rewrite


【解决方案1】:

URI 查询参数的问题是它们可能以任何顺序出现。使用两个参数,您只有两个排列(A before BB before A)。但是,您想要提取的参数越多,您拥有的排列就越多 (n!)。

这意味着您应该将参数按正确的顺序排列,以便一次可以使用它们:

RewriteCond %{THE_REQUEST} ^GET\ /view\.php
RewriteCond %{QUERY_STRING} ^(([^&]*&)*)(page=[^&]+)&?([^&].*)?$
RewriteCond %3&%1%4 ^(([^&]*&)*)(user=[^&]+)&?([^&].*)?$
RewriteCond %3&%1%4 ^user=([^&]+)&page=([^&]+)&?([^&].*)?$
RewriteRule ^view\.php$ /%1/%2?%3 [L,R=301]

第一个条件像您的规则一样检查请求行。第二个条件选择 page 参数并将其放在查询字符串的开头。第三个条件与 user 参数相同,因此顺序始终为:第一个 user,第二个 page。然后我们使用第四个条件一次获取两个参数值,以便在RewriteRule 替换中使用它们。查询的其余部分附加到替换 URI(请参阅 %3),但您可以根据需要将其关闭。

如您所见,要提取的参数越多,它就越复杂。并且使用比 PHP 这样的 mod_rewrite 更强大的语言更容易做到这一点。

【讨论】:

  • 你说得对,这会变得很复杂。我已经开始使用 codeigniter 重写我的项目,我认为我可以使用路由。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-12-22
  • 2016-10-14
  • 1970-01-01
  • 2013-03-24
  • 1970-01-01
相关资源
最近更新 更多