如何使用Mod_Rewrite在最终短划线和文件扩展名之间获得变量?

时间:2013-11-21 04:02:54

标签: php regex apache .htaccess mod-rewrite

使用mod_rewrite规则取得了巨大成功,但遇到了障碍。

我想要在最终的破折号和文件扩展名之间获取所有内容。例如。在以下示例域名domain.com/folder/sub-folder/product-title-that-may-contain-dashes-and-numbers-347.html中,我希望获得“347”字符。

这是项目ID,正在传递给item.php页面。 (目前它只是一个整数,但我希望改变它,以便它可以是字母数字,例如.347b)

我正在使用以下代码。

RewriteRule  ^folder/.*/.*-([0-9]+)\.html$   item.php?item-id=$1 [NC,L]

这适用于大多数URL,但是当最后一个斜杠后面的字符以数字开头时,它会生成一个错误(“此网页有一个重定向循环”,“错误代码:ERR_TOO_MANY_REDIRECTS”)。如果在最后一个斜线后的字符内的任何其他地方都有一个数字,那就没关系,只是不在开头。

有什么想法吗?

PS。请善待。这是我在论坛上发表的第一篇文章/问题。如果我没有遵守任何适用于标准用户的常识的适用规则/礼仪/手续/等,请原谅。 (我通常通过谷歌搜索找到问题的答案,但似乎找不到这个具体例子。)

1 个答案:

答案 0 :(得分:0)

仅供参考,请回答以下完整的问题(和实际问题),以防其他人帮助。

引用的mod_rewrite代码实际上是正确的。发现错误存在于传递变量的文件中。

由于我最近更改了URL的格式,我在PHP文件中使用PHP 301重定向来重定向文件格式:

domain.com/folder/sub-folder/product-title-that-may-contain-dashes-and-numbers/3 47

采用新格式:

domain.com/folder/sub-folder/product-title-that-may-contain-dashes-and-numbers-3 47.html

PHP代码中存在错误。

在我使用的PHP文件中:

$lastNumbers = substr($currentURL, strrpos($currentURL, '/' )+1 );

以旧URL格式获取最终斜杠后的字符(例如domain.com/folder-sub-folder/product-name/347的“347”组件)。

但是使用了糟糕的代码,它试图将旧格式的URL重定向到新格式的URL,以便在最终斜杠之后直接以数字开头(根据原始问题)。

更新它以使用基本:

if (is_numeric($lastNumbers)) {
    header("HTTP/1.1 301 Moved Permanently");
    header("Location: $redirectURL");
    exit();
}