Wordpress永久链接和重定向

时间:2015-09-08 21:05:31

标签: wordpress .htaccess redirect rewrite permalinks

我每天都使用wordpress,之前没有看过这个问题。也许SO社区有一些见解。

我有一个标准的wordpress install v4.3,这是当前版本。我没有活动的重写模块。没有基类别或标签设置。永久链接设置为"帖子名称"干净的URL,适用于整个网站,除了/ blog

下的所有内容

我曾尝试将/ blog / *重写为index.php?page_id = xxx并编写了一个自定义解析器来处理URI段,这似乎在本地工作。但是,在服务器上,所有/ blog / xxx只是重定向到/ blog /,即使我没有明确告诉它这样做。

我试过在.htaccess中设置这个:

RewriteRule blog/(category|tag|page|search)/(.+)/?$ index.php?page_id=123
即使正则表达式检出并且我对自定义帖子类型的所有其他重写规则都有效,

也无法正常工作。

当失败时,我尝试编写重写规则钩子:

// pathetic hack to fix wp permalink horror for blogs
add_filter( 'rewrite_rules_array','my_insert_rewrite_rules' );
add_action( 'wp_loaded','my_flush_rules' );

// flush_rules() if our rules are not yet included
function my_flush_rules(){
    $rules = get_option( 'rewrite_rules' );

    if(isset($_GET['rules']))
    {
        echo '<pre>';
        print_r($rules);
        echo '</pre>';
    }

    if ( ! isset( $rules['blog/(category|tag|page|search)/(.+)/?$'] ) ) {
        global $wp_rewrite;
        $wp_rewrite->flush_rules();
    }
}

// Adding a new rule
function my_insert_rewrite_rules( $rules )
{
    $newrules = array();
    $newrules['blog/(category|tag|page|search)/(.+)/?$'] = 'index.php?page_id=123';
    return $newrules + $rules;
}

其中,如果你运行?浏览器中的规则显示当前的重写数组,它确实将它添加到数组中。但由于某种原因,WP正在采取的行动是重定向到index.php?page_id = 123而不是加载它并让我自己解析URI。喜欢&#34;博客&#34;以某种方式保留。

还有其他人见过这样的事吗?我能想象的唯一相关插件可能是破坏CCTM,但博客不是自定义内容类型。 / blog只是一个普通的页面,就像根据URI段提取帖子一样。

我建议尝试为这些页面使用标准WP体系结构,但客户端坚持所有内容都在/ blog / category / category_name / page / x下。他们不想让我这样做,我理解,因为在本地它按预期工作。是的,服务器设置有细微的差别,但常见的核心元素是相同的 - 启用了htaccess,wp是root,没有安装在目录中等等。

我尝试过禁用所有插件,切换到2015主题,刷新固定链接,清除缓存等等。非常奇怪。

任何输入或类似的故事都可能导致解决方案,所以我欢迎你所拥有的。

1 个答案:

答案 0 :(得分:1)

我正在回答我自己的问题,因为看起来很多其他人都有类似的问题而接受的答案很少。所以对于我的具体案例,这就是答案:

首先,在huksley's answer之后,我在web根目录中编写了备用index_pass.php文件。该文件仅包含此内容:

<?php $_SERVER["REQUEST_URI"] = $_SERVER["REDIRECT_URI"]; include("index.php");

接下来,我在wordpress默认值之前添加htaccess规则。 E = URI:part是这里的关键:

RewriteEngine On
RewriteBase /

RewriteRule ^blog/(category|tag|page|search)/(.+)/?$ index_pass.php?page_id=123 [NC,L,E=URI:somedomain.com/blog/$1/$2/$3/$4]

#wordpress defaults below

然后在主题的functions.php中我添加这个以防止新的hacky垃圾解决方案抛出404:

add_filter('template_redirect', 'my_404_override' );
function my_404_override() {
    global $wp_query;

    if (strpos($_SERVER['REQUEST_URI'], "blog/category") > -1 || strpos($_SERVER['REQUEST_URI'], "blog/tag") > -1 || strpos($_SERVER['REQUEST_URI'], "blog/search") > -1) {
        status_header( 200 );
        $wp_query->is_404=false;
        $bypass = true;
        include('page-blog-index.php');
        exit;
    }
}

那里的流氓$绕道只是告诉我在page-blog-index.php中填写这个重击解决方案造成的空白

所以我们拥有它。有用。我不是完全正面的,为什么我对此感到有点不舒服,但最终我并不关心它有效。我更倾向于有一个实际的解决方案,它不会违反任何理智的程序员的思维,并且在多个博士衍生的CMS的实际骨架内,但是嘿,我们不能一直赢,对吧? / p>

希望它可以帮助别人。