【问题标题】:Redirect and rewrite with mod_rewrite使用 mod_rewrite 重定向和重写
【发布时间】:2011-07-24 21:10:54
【问题描述】:

在问了这个问题后:Clean URLs for search query? 我用 mod_rewrite 尝试了一些东西:

RewriteCond %{QUERY_STRING} ^s=([a-z]+)$ [NC]
RewriteRule / /s/$1? [NC,R=301,L]

RewriteRule ^s/([a-z]+)$ /?s=$1 [NC,L]

目标是什么?

  1. http://example.com/?s=query 重定向到http://example.com/s/query
  2. http://example.com/s/query 重写为http://example.com/?s=query

这看起来像是双重工作,但如果你仔细看看你会发现我试图完成什么:

  1. 将任何搜索查询字符串重定向到更简洁的等效项(无论是表单,还是直接输入的人)
  2. 将该 URL 重写(而不是重定向)回动态查询字符串,以便我可以通过 $_GET 使用 PHP 获取它

如果我这样想应该是可能的。 所以我想寻求经验丰富的模组重写者的帮助来帮助我解决这个问题。

2 号有效,但仅此而已。

【问题讨论】:

标签: apache .htaccess mod-rewrite redirect query-string


【解决方案1】:

这应该可以,我用一些不同的名称和目录对其进行了测试,但在你的情况下应该没问题。

注意:对于来自 RewriteCond 的匹配组,您必须使用 %1 而不是 $1

RewriteCond %{QUERY_STRING} ^s=([a-z]+)$ [NC]        
RewriteRule ^$ /s/%1? [NC,R,L]                     

RewriteRule ^s/([a-z]+)$ /?s=$1 [NC,L] 

编辑调试(见 cmets):

我的测试是:

| /
| --> doc
|   |
|   --> doc.php (takes doc as GET parameter)
|     | index.php

我的 apache 重写是

RewriteCond %{QUERY_STRING} ^doc=([a-z]+)$ [NC]
RewriteRule ^$ /doc/%1? [NC,R,L]

RewriteRule ^doc/([a-z]+)$ /doc/doc.php?doc=$1 [NC,L]

然后询问 domain.com/?doc=query 显示 doc is query

为我工作。

【讨论】:

  • 前两条规则似乎有效,但是当我取消注释第三条时,它给出了这个错误:Chrome 中的“此网页有一个重定向循环”,而 Firefox 中的类似。我不太明白这一点,因为前两个规则重定向,然后 htaccess 文件再次加载,但前两个规则不再匹配,因为它已经被重定向并且只有第三个规则适用。
  • 已编辑。我忘记了一个空行,你看到了吗?这可能是问题所在。我添加了我的conf进行调试。随时通知我。
  • 之后可能会重新加载 .htaccess。我猜它什么时候发生:xx/?s=query --> xx/s/query --> xx/?s=query 和循环。我觉得你需要制作一些文件来接收最后一行,如s.php?s=query 然后如果它不匹配重写条件,因为它包含一个文件名。顺便说一句,您已经拥有处理查询字符串的文件,因此只需将其添加到 /?s=$1 [NC,L] 前面。
  • 你的意思是你还有查询字符串?
  • 第二次搜索怎么称呼?确保使用正确的相对路径,以便它也通过重写规则。
猜你喜欢
  • 2011-04-14
  • 2012-02-22
  • 2011-03-18
  • 2012-02-22
  • 2017-12-17
  • 1970-01-01
  • 2011-09-08
  • 2011-09-28
  • 1970-01-01
相关资源
最近更新 更多