【问题标题】:How to make this rewrite rule work?如何使这个重写规则起作用?
【发布时间】:2013-02-21 04:34:05
【问题描述】:

我正在尝试做的是一个非常简单的想法,但不知何故它不起作用。我需要这个重写规则才能工作:

RewriteRule ^([a-zA-Z0-9-]+)/?([a-zA-Z0-9-=]*)$ index.php?op=$1&$2 [L,NC]

我认为这几乎是不言自明的,但我希望规则将第一个正则表达式组作为 op 参数传递,第二个正则表达式组原封不动地传递给脚本。像这样:

http://example.org/view/?post_slug=awesome-apache-mods --> http://example.org/index.php?op=view&post_slug=awesome-apache-mods

这里的问题是第一部分工作得很好,这意味着op 参数设置正确但第二部分丢失了。我的意思是字面上输了。当我发出print_r($_GET) 时,只有op 参数。

Array
(
    [op] => view
)

我想知道这里有什么问题?

【问题讨论】:

  • 重写规则 ^([a-zA-Z0-9-]+)/?([a-zA-Z0-9-=]*)$ index.php?op=$1&post_slug=$2 [L,NC] 也许是那样的东西?你错过了第二个变量,因为它是发送的空值变量,它没有出现在 print_R
  • 我在正则表达式中看不到任何匹配 post_slug 的(低于分数 _)?
  • @IesusSonesson 第二个变量并不总是post_slug。关键是它可以是任何东西。

标签: php apache mod-rewrite url-rewriting


【解决方案1】:

我使用 preg_match_all 测试了您的模式,它与 URL 不匹配,因为 _ 未在模式中定义,但是当我添加 _ 时,它与 URL 匹配:

$text = 'view/?post_slug=awesome-apache-mods';
$pattern = '/^([a-zA-Z0-9-]+)\/\?([a-zA-Z0-9_=-]*)$/';
preg_match_all($pattern, $text, $out);
print_r($out);

那么你的 .htaccess 模式应该是这样的:

^([a-zA-Z0-9-]+)/\?([a-zA-Z0-9_=-]*)$ [L,NC, QSA]

如果 /view 是常量,最好使用它:

RewriteRule ^([a-zA-Z0-9_-=]*)$ index.php?op=view&$2 [L,NC, QSA]

【讨论】:

  • 谢谢,我回家试试看,如果成功了再告诉你。虽然我认为问题不在于缺少下划线,因为我之前已经尝试过。看来可能是未转义的问号!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-06-17
  • 2013-07-06
相关资源
最近更新 更多