【问题标题】:mod_rewrite rule to redirect specific URL matches用于重定向特定 URL 匹配的 mod_rewrite 规则
【发布时间】:2014-04-23 16:37:25
【问题描述】:

我正在使用 mod_rewrite 将长 URL 重定向到特定页面。它适用于商店,所以基本上如果 URL 是一个文件夹深,它将用户带到特定页面,如果 URL 是两个文件夹,它将把它们带到另一个文件夹等。我使用以下方法实现了这一点......

RewriteRule ^([^/\.]+)/?$ shop.php?category=$1 [L]
RewriteRule ^([^/\.]+)/([^/\.]+)/?$ brand.php?category=$1&brand=$2 [L]
RewriteRule ^([^/\.]+)/([^/\.]+)/([^/\.]+)/?$ handler.php?category=$1&brand=$2&product=$3 [L]
RewriteRule ^([^/\.]+)/([^/\.]+)/([^/\.]+)/([^/\.]+)/?$ handler.php?category=$1&brand=$2&product=$3&car=$4 [L]

请注意,每个规则都比前一个更深一个文件夹。

我宁愿将用户带到http://www.domain.com/PRODUCT/DB/ID,而不是在下一阶段使用另一个规则,即最终产品页面,所以我编写了一个规则来检查第一个文件夹是否是 PRODUCT,如果是,则将用户带到 PRODUCT。 PHP?DB=$1&ID=$2...

RewriteRule ^product/([^/\.]+)/([^/\.]+)/?$ /product.php?db=$1&id=$2 [L]

但它一直返回 404 错误。我将这条新规则放在其他规则之前,希望它能在任何其他规则之前执行此规则(这似乎是 3 个文件夹深,当第一个文件夹不是 PRODUCT 时,还有另一条规则)

.htaccess 和后续的 .php 文件位于站点的根级别。

我写的规则正确吗?我已经尝试了各种方法并到处查看,但这样的问题通常与忽略我实际上不想做的特定文件夹有关。

谢谢

【问题讨论】:

  • 你在字符类[]中用\.做什么?如果您想从字面上匹配句点/句号,则不需要转义。如果您想匹配 / 之间的所有内容,只需使用 [^/]+。
  • 我删除了所有的\。没有什么能像那样使用它?
  • 你能加载domain.com/product.php?db=db&id=123吗?
  • [^/.]+(或 \.)应该匹配直到但不包括下一个 / 或句点的所有内容。一个或多个非/和非。是必须的。这就是为什么我问你是否真的想停一段时间。您是说第一组 4 个 RewriteRule 有效,但是将第 5 个 RewriteRule before 添加到其他 4 个会给出 404? product.php 存在于站点根目录中?您的目录路径名中没有句点?
  • 是的,前 4 个有效,但第 5 个(产品)无效(我将它放在其他 4 个之前)。我已经删除了所有的反斜杠,原来的 4 个现在可以工作,但 /product 一个不起作用。是的,它给出了 404 错误。 .htaccess 文件和 product.php 文件都位于根目录 (www.domain.com/product.php)

标签: .htaccess mod-rewrite redirect


【解决方案1】:

尝试关闭多视图:

Options -Multiviews

Multiviews 是 mod_negotiation 的一部分,它尝试将请求匹配到现有文件,包括缺少扩展名的文件。因此,mod_negotiation 可能会看到对 /product/something 的请求并看到文件 /product.php 并使用 PATH INFO 提供该文件,这将完全绕过 mod_rewrite。

【讨论】:

  • 是的,成功了!为什么它无法提供 product.php 文件呢?它显然在做你所说的它可能正在做的事情,但随后给出了 404 错误。奇怪,但谢谢!这让我发疯了!
  • @Scott 不确定,可能有多种可能性。也许您的 product.php 文件无法识别请求并返回 404 本身,或者 php 未设置为执行 PATH INFO 样式请求
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-12-03
  • 1970-01-01
  • 2011-09-08
  • 2015-01-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多