【发布时间】: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