格式化.htaccess RewriteCond / RewriteRule用于从URL中删除查询字符串

时间:2013-08-15 20:14:10

标签: php apache .htaccess rewrite

我开发了一个PHP站点,它使用_GET变量构建单个产品页面。 (实时)站点的URL的当前结构如下:

http://campbellssweets.com/shop/popcorn/product.php?subject=Bacon+and+Cheddar+Popcorn

我有两个问题:

1)在我的.htaccess文件中构造RewriteCond和/或RewriteRule以从上面的示例中删除'product.php'和查询字符串的正确方法是什么?

2)同样,我怎么能用破折号替换'+',以便最终的URL显示为:

http://campbellssweets.com/shop/popcorn/Bacon-and-Cheddar-Popcorn

对于它的价值,我正在利用保存在子文件夹中的'index.php'方法从类别页面中删除'.php'。

我真的很感激帮助!

我已添加了下面的当前工作流程,希望能更好地解释我的问题。抱歉,如果我在这里做错了,这是我的第一篇文章

我有一个类别页面,通过循环列出数据库中的所有项目。该页面保存为index.php:

/shop/popcorn/index.php

类别页面中列出的每个项目都链接到各个产品页面(product.php),该页面与类别页面位于同一目录中。 (product.php)页面是动态的,其内容取决于$ _GET变量的值:生成product.php页面的主类别页面中的链接如下:

<a href="product.php?subject=<?php echo urlencode($list_savory["product_name"]); ?>">

产品页面网址(这是此问题的焦点),显示为:

店/爆米花/ product.php?受试者=培根+和+切达+爆米花

我试图找出正确的.htaccess代码,该代码会从网址中删除查询字符串,并用破折号替换“+”,以便它们显示为:

店/爆米花/培根 - 和 - 切德-爆米花

Ravi的回答确实以我请求的方式格式化了URL',但页面无法加载,我收到'404 Not Found'错误 - 即使我成功修改了product.php条件接受$ _SERVER [' REQUEST_URI']而不是$ _GET变量。

我希望这有助于清除一切。对不起再次感到困惑,我是新来的。

1 个答案:

答案 0 :(得分:1)

假设您的.htaccess位于网络根/目录

RewriteEngine on
RewriteBase /

RewriteCond %{QUERY_STRING} !no-redir [NC]
RewriteCond %{QUERY_STRING} (^|&)subject=([^&]+) [NC]
RewriteRule ^(.*)/product.php$ $1/%2? [NC]

RewriteRule ^([^+\s]+)(?:[+\s]+)([^+\s]+)((?:[+\s]+).*)$ $1-$2$3 [DPI,N]
RewriteRule ^([^+\s]+)(?:[+\s]+)([^+\s]+)$ $1-$2 [R=301,DPI,L]

编辑 :(解析关键字的URI)

Chris,我们的想法是现在从路径信息中捕获主题而不是GET参数,因为它没有作为?subject=sub+info传递,这使得它现在不能用作$_GET['subject']

您需要从URI路径获取主题关键字,如下所示:

$uri = $_SERVER['REQUEST_URI'];
$subject = substr($uri, strrpos($, "/"));

编辑 :(双向重定向)

在上面定义的规则之后添加以下内容。

RewriteRule ^(.*/popcorn)/([^/.]+)$ $1/product.php?subject=$2&no-redir [NC,L]

注意,我在RewriteCond上面添加了另一个%{QUERY_STRING}。这也意味着您可以将product.php恢复为自subject像往常一样再次传递之前的方式。