【问题标题】:mod_rewrite trouble with /product/?id={xyz} to /product/{xyz}/product/?id={xyz} 到 /product/{xyz} 的 mod_rewrite 问题
【发布时间】:2013-04-19 15:48:57
【问题描述】:

我的尝试:

RewriteCond %{QUERY_STRING}     ^id=(.*)$    [NC]
RewriteRule ^/product$       /product/%1      [NC,L,R=301]

我只想将此规则应用于/product//supplier/ 目录。它们都是一级子目录。

注意:product/?id={xxx} 实际上是 product/index.php?id={xxx}。 Apache 隐藏了我的扩展和索引。只是想指出这一点。

我的product/index.php 处理给定的参数并确定它应该显示的页面:

index.php

if ( isset( $_GET['id'] ) && !empty( $_GET['id'] ) ) {
   //html for individual page e.g. /product/?id=foo
   //e.g. <h1><?= $_GET['id'] ?> Page</h1>
} else {
   //html for product list e.g. /product/ (no parameters)
}

【问题讨论】:

  • 您尝试在哪里,在一个 .htaccess 文件中?
  • 是的,位于根目录中。

标签: .htaccess mod-rewrite


【解决方案1】:

在根目录的一个 .htaccess 文件中试试这个:

Options +FollowSymlinks -MultiViews
RewriteEngine On
RewriteBase /
RewriteCond %{QUERY_STRING} id=(.+)          [NC]
RewriteRule ^(product|supplier)/?$   /$1/%1? [NC,L,R=301]

在 .htaccess 文件中,在规则中测试它的 URI 路径没有前导斜杠 (^/product),因此正则表达式也不能有它。 trailng ? 删除传入的查询。

如果要将规则集放在 Apache 主配置文件中,则应保留前导斜杠:^/(product|supplier)/?$

更新

显示想要的 URL,但仍从原始 URL 获取数据。

请求:/product/?id=parameter

Options +FollowSymlinks -MultiViews
RewriteEngine On
RewriteBase /

RewriteCond %{THE_REQUEST} ^(GET|HEAD)\s/(product|supplier)/\?id=([^\s]+) [NC]
# Strip the query and redirect permanently
RewriteRule  ^(product|supplier)  /$1/%3?   [R=301,L,NC]

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{QUERY_STRING} ^$
# Map internally to the original request
RewriteRule  ^(product|supplier)/([^/]+)/?  /$1/?id=$2  [L,NC]

另一种选择是直接在请求中使用“漂亮”的 URL:

请求/product/parameter/product/?id=parameter

Options +FollowSymlinks -MultiViews
RewriteEngine On
RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{QUERY_STRING} ^$
RewriteRule  ^(product|supplier)/([^/]+)/?  /$1/?id=$2  [L,NC]

【讨论】:

  • 为什么我们要删除传入的 GET 查询?例如。 product/?id=pickles => `product/pickles 会给我一个 404 而不是显示泡菜的页面。
  • 脚本无法从您请求的新 URL 获取参数,因为它不包含查询字符串。实现所需的唯一方法是重定向到/product/{xyz},只是在浏览器的地址栏中显示该URL,同时静默映射回product/?id=pickles,以允许脚本获取查询字符串。我想这就是你真正需要的。
  • 酷。静默映射会导致 URL 再次变回 /product/?id=pickles 吗?如果不是,我该怎么做?
  • 是的。但也许可以使用漂亮的 URL 而不是带有查询的 URL。您能否检查一下answer,其中描述了这两个选项,并告诉我哪一个符合您的要求?
  • 用这两个选项更新了我的答案。希望其中之一是您所需要的。
猜你喜欢
  • 1970-01-01
  • 2011-07-13
  • 2013-01-19
  • 2020-09-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-23
  • 1970-01-01
相关资源
最近更新 更多