【问题标题】:mod_rewrite with GET requests带有 GET 请求的 mod_rewrite
【发布时间】:2010-06-02 16:35:32
【问题描述】:

我的大部分网站都有 mod_rewrite。现在我有一个搜索通常会指向

search.php?keyword=KEYWORD

我正在尝试将其重写为

search/?keyword=KEYWORD

只是为了让它更干净一点。所以这是我的 mod_rewrite。 (还有其他规则,我只是发布不起作用的规则。)

RewriteRule ^search/?keyword=([^/\.]+)/?$ search.php?search=$1

当我以我希望的方式在地址栏中键入搜索时,我得到一个页面,告诉我它的“链接断开”(我猜这相当于 Chrome 的 404 错误)。那么我做错了什么?我认为问题是“=”或“?”登录规则(第一部分),因为当我取出 ?keyword= 部分时,它可以工作。这有意义吗?


编辑:这是我的完整 .htaccess 代码:

RewriteEngine on
RewriteRule ^$ index.php
RewriteRule ^thoughts$ archives.php 
RewriteRule ^thoughts/$ archives.php
RewriteRule ^about$ about.php 
RewriteRule ^about/$ about.php 
RewriteRule ^search/\?keyword=([^/]+)$ search.php?search=$1 
RewriteRule ^tags/([^/]+)$ tags.php?tag=$1
RewriteRule ^thoughts/([^/]+)$ post.php?title=$1 [L]

仍然收到错误页面...

【问题讨论】:

  • 在正斜杠之前需要一个反斜杠吗?正斜杠对某些正则表达式库有意义。
  • 不,尝试并没有改变任何东西。另外,我所有其他用斜线重写的工作都很好。不过谢谢!

标签: apache .htaccess mod-rewrite


【解决方案1】:

如果你只是想改造:

search.php?keyword=KEYWORD

进入:

search/?keyword=KEYWORD

您需要做的就是:

RewriteRule ^search/$ search.php [QSA]

QSA 标志的意思是“查询字符串附加”,并通过 GET 传递给 search.php:

search/?keyword=KEYWORDD
search/?name=value&name2=value2    

您可能还想查看Apache MultiViews,它将每个 /foo 请求发送到它在 / 目录中找到的任何 foo.* 文件,尽管它们是 considered bad

【讨论】:

  • 我希望人们停止链接到那篇文章。在apache中应该如何配置PHP是一个误区(提示:不是Addtype application/x-httpd-php .php
【解决方案2】:
RewriteRule ^search/\?keyword=([^/.]+)/?$ search.php?search=$1

问号字符在正则表达式中具有特殊含义。你需要逃避它。

此外,点在字符类中没有特殊含义;您无需转义它(您要求该关键字不包含正斜杠和点)。

【讨论】:

  • 谢谢,我想有类似的东西,但我仍然有问题。我仍然收到 saem 错误页面。我发布了我的整个 .htaccess 代码,因为也许我做错了什么。
  • @iMaster 您确定要在查询字符串末尾添加/? 吗?我什至不确定/? 是否可以在查询字符串中。
  • 我修改过的.htaccess 已经贴在上面了。我仍然没有得到任何结果。
猜你喜欢
  • 2016-08-24
  • 1970-01-01
  • 2020-09-07
  • 2021-12-19
  • 1970-01-01
  • 1970-01-01
  • 2013-10-05
  • 2021-06-01
  • 2013-02-21
相关资源
最近更新 更多