我开发了一个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变量。
我希望这有助于清除一切。对不起再次感到困惑,我是新来的。
答案 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
像往常一样再次传递之前的方式。