【问题标题】:Formatting .htaccess RewriteCond / RewriteRule for removing query string from URLs格式化 .htaccess RewriteCond / RewriteRule 以从 URL 中删除查询字符串
【发布时间】:2013-08-18 03:10:52
【问题描述】:

我开发了一个 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"]); ?>">

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

shop/popcorn/product.php?subject=Bacon+and+Cheddar+Popcorn

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

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

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

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

【问题讨论】:

  • 在此处或在搜索引擎上搜索“PHP 路由” - 您将获得大量结果然后:)
  • (为了字面意思浏览网页,有人使用Brillo pad吗?:-D
  • 夸张删除。谢谢halfner。

标签: php apache .htaccess rewrite


【解决方案1】:

假设您的 .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)

克里斯,现在的想法是从路径信息而不是 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 正在像往常一样再次被传递。

【讨论】:

  • 该代码可以完美地重新格式化 URL,但是我现在收到 404 服务器错误。登陆页面有一个条件来检查是否在页面加载之前设置了 $subject 变量 - 重新格式化的 URL(没有“subject=”)会影响条件吗?
  • 是的,会的。除非以 ?subject= 传递,否则着陆页将无法识别主题。我认为将网址格式化为/shop/popcorn/?subject=Bacon-and-Cheddar-Popcorn 应该可以。您的来电。如果您愿意,请将其缩短为 s 或传递为 /?Bacon-and..。您的 php 必须相应地适应。我建议您保留漂亮的 url 并使用带有子字符串的 lastIndexOf "/" 来捕获主题。
  • 感谢 Ravi 的帮助,'lastIndexOf"/" with sub-string' 是 JavaScript 函数吗?我不熟悉那个名称的 PHP 函数。如果您能提供有关如何使用该技术的任何指导或链接,我将不胜感激。
  • @Chris,它们是 PHP strrpos()substr() 的 Java 等价物。请看我的更新。这就是我为您的登录 php 页面提出的更改。
  • Ravi,我能够利用 $_SERVER['REQUEST_URI'] 变量来满足条件
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-18
  • 1970-01-01
  • 1970-01-01
  • 2017-06-01
  • 2021-09-28
相关资源
最近更新 更多