2

我需要通过删除要保留的字符串之前和之后的字符串来重写下面的 URL。我需要有效地做到这一点,因为我有 30,000 个这样的 URL 需要重定向。

我知道我可以使用正则表达式规则删除我想要的字符串之前的字符串blah-blah-blah-the-post-title - 但我不知道如何删除剩余的&catid=210:the-category-title&Itemid=7891011. 我需要添加一个斜杠。

所以,换句话说,我需要重定向这个 URL 模式

http://www.domain.com/index.php?option=com_content&view=article&id=123456:blah-blah-blah-the-post-title&catid=210:the-category-title&Itemid=7891011

对这个模式

http://www.domain.com/blah-blah-blah-the-post-title/

是否可以在 .htaccess 中使用 grep 执行此操作?还是我最好使用php?

而且,如果是php,如何?(这里是正则表达式和php新手)。

4

2 回答 2

1

这应该可以满足您的需求。我们正在解析变量的服务器变量%{QUERY_STRING}查询GET字符串id。我们不想要变量的第一部分,所以我们不会在 RegEx 组中捕获它();括号中的部分应该是您要查找的内容。此外,我们将尝试在查询字符串中的任何其他变量之前结束它,方法是查找任何不是&字符的内容。然后我们寻找一个可能的文字&字符。

我们%1在规则中使用 来回显捕获的字符串,然后附加斜线并添加?标记以表明我们没有 . 的行为[QSA] Query String Append。我们告诉它我们想要一个重定向,所以我们通过它R并且L最后。如果您希望它成为永久重定向,您可以使用[R=301].

RewriteEngine On
RewriteBase /
RewriteCond  %{QUERY_STRING} id=\d+:([^&]+)&?
RewriteRule .* %1/? [R,L]

.htaccess更好(更快),但要在 PHP 中执行此操作,您需要先编辑创建此链接的​​代码。但是,如果您尝试在页面加载后更改页面上的此链接,您可以这样做(在页面顶部):

if(preg_match('!^/index\.php!',$_SERVER['REQUEST_URI'])){
   if(!empty($_GET['id'])){
       $id=$_GET['id'];
       $parts = explode(':',$id);
       $newPath = 'Location: /'.$parts[1].'/';
       header($newPath);
       exit();   
   }
}
于 2013-08-19T01:27:52.717 回答
0

更新:使用 .htaccess 我不确定您是否能够访问参数。我也觉得没必要?如果您想向用户显示不同的页面,那么您应该查看下面的代码。

如果您使用 PHP,那么:

<IfModule mod_rewrite.c>
    Options +FollowSymLinks
    RewriteEngine on

    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteRule ^(.*)$ index.php?url=$1 [QSA,L]
</IfModule>

在您的 .htaccess 中将制作:

http://www.domain.com/blah-blah-page/

变成类似的东西:

http://www.domain.com/index.php?url=blah-blah-page

QSA 基本上意味着它保留给定的参数,例如:

http://www.domain.com/blah-blah-page/?test=hej 

变成:

http://www.domain.com/index.php?url=blah-blah-page&test=hej

然后在您的 PHP 中,您将执行以下操作:

if (isset($_GET['url']) && !empty($_GET['url'])) {
    $url = $_GET['url'];
    unset($_GET['url']);
    $v = explode('/', $url);

    $lowerCaseAction = strtolower($v[0]);
}

希望这将帮助您走上正确的道路。

于 2013-08-19T01:06:34.510 回答