我开发了一个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
将像往常一样再次传递。