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


Formatting .htaccess RewriteCond / RewriteRule for removing query string from URLs

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

http://campbellssweets.com/shop/popcorn/product.php?subject=Bacon+和+切达干酪+爆米花

我有两个问题:

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"]); ?>">

产品页面的URL(这是这个问题的焦点)显示为:

商店/爆米花/product.php?subject=培根+和+切达干酪+爆米花

我试图找出正确的.htaccess代码,该代码将从URL中删除查询字符串,并用破折号替换"+",这样它们就会显示为:

商店/爆米花/培根和切达爆米花

拉维的回答确实按照我请求的方式格式化了URL,但页面无法加载,我收到了一个"404未找到"错误——即使我成功修改了product.php条件以接受$_SERVER['REQUEST_URI']而不是$_get变量。

我希望这有助于澄清一切。再次为您的困惑感到抱歉,我是新手。

假设您的.htaccess在web根目录/

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]

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