【问题标题】:Simple htaccess rewrite/redirect to search page简单的 htaccess 重写/重定向到搜索页面
【发布时间】:2011-10-04 03:40:44
【问题描述】:

我有一个向名为 search.php 的页面发送 GET 请求的搜索表单。我在我的 htaccess 文件中设置了重写规则,这些规则将某些内容(如 /search)重写到各自的页面。我只是想获取 search.php?q=query 并将其重写为 /search/query。

这就是我所拥有的。

RewriteRule search.php?q=(.*) /search/$1
RewriteRule search/(.*) search.php?q=$1 [nc]

我做错了什么?!

这是完整的文件

ErrorDocument 404 /index.php?p=404

Options +FollowSymLinks
RewriteEngine On

RewriteCond %{REQUEST_FILENAME} !-f  
RewriteRule ^images/.*\.jpg$ /images/default.jpg [L] 

RewriteCond %{HTTP_REFERER} !^$  
RewriteCond %{HTTP_REFERER} !^http://(www\.)?wghandcrafted.com/.*$ [NC]  
RewriteRule \.(gif|jpg|jpeg|psd|js|swf|flv|png)$ /feed/ [R=302]  

RewriteRule ^(products|blog|feed|search|checkout|checkout)$ $1.php [nc]
RewriteRule products/cat/(.*)$ products.php?type=cat&cat=$1 [nc]
RewriteRule products/(.*)$ products.php?type=single&product=$1 [nc]
RewriteRule blog/(.*) blog.php&post=$1 [nc]
RewriteRule feed/(.*) feed.phptype=$1 [nc]

RewriteRule search\.php?q=(.*)$ /search/$1 [R=301,L]
RewriteRule search/(.*)$ search.php?q=$1 [NC]

【问题讨论】:

    标签: php .htaccess mod-rewrite rewrite


    【解决方案1】:

    让第一行执行重定向,第二行执行重写

    RewriteRule search\.php?q=(.*)$ /search/$1 [R=301,L]
    RewriteRule search/(.*)$ search.php?q=$1 [NC]
    

    移动

    RewriteCond %{REQUEST_FILENAME} !-f  
    RewriteRule ^images/.*\.jpg$ /images/default.jpg [L]
    

    到规则集的末尾。

    否则,RewriteCond %{REQUEST_FILENAME} !-f 规则会先于其他任何规则执行,这意味着只有对不存在文件的请求才会由该行下方的任何规则处理。由于有一个search.php 文件,因此无法达到该规则。

    【讨论】:

    • 仍然无法正常工作...还有其他建议吗?我将发布我的完整 .htaccess 文件。
    • @sun-tzu:见修正答案。 RewriteCond %{REQUEST_FILENAME} !-f 行是您的问题,或者更具体地说,是位置问题。
    • 我很抱歉地说 .. 但是 RewriteRule 不能以这种方式处理查询字符串——这不会工作 search\.php?q=(.*)$。 RewriteRule 模式将仅匹配 URL 的路径部分。即使它会......你极有可能得到一个重写循环(这就是 mod_rewrite 和 .htaccess 的工作方式)
    • 您对我如何完成这个有什么建议吗?我只需要我的搜索查询在 /search/. 之后
    【解决方案2】:

    我遇到了同样的问题,这是我发现的一个对我有用的解决方案,在我的网站上,查询被发送到 index.php,我发现如果我有“^index.php$ /search/%1 ? [R=301]" 作为第一个重写规则它只会出错,因为第二个重写规则使它只是进入一个循环所以我用 "^$" 替换 "^index.php$" 允许它仍然请求同一个文件。它可能不是最好的解决方案,但可以解决这个问题。这是我的工作代码:

    Options +FollowSymLinks
    RewriteEngine on    
    
    RewriteCond %{QUERY_STRING} ^q=(.*)$
    RewriteRule ^$ /search/%1? [R=301]
    
    RewriteBase /search
    RewriteRule ^search/(.*)$ /index.php?q=$1 [NC]
    

    【讨论】:

      猜你喜欢
      • 2023-03-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-07-22
      相关资源
      最近更新 更多