rewriterule not working

时间:2016-02-25 作者:rewrite_redirect

我有帖子类型example 有2条记录:exam1exam2. 此帖子类型是由插件创建的Types Toolset (www.wp-types.com). So链接到exam1 看起来像my_site/example/exam1. 我还有一个GET参数:my_site/example/exam1?get=param.<我需要什么。我需要从重写URLmy_site/example/exam1?get=parammy_site/param/exam1. 我写了这条规则:

RewriteRule ^(exam1|exam2)/([^/]+)/?$ /example/$2/?get=$1 [QSA,L]
这是正确的规则。它应该会起作用。但它不起作用。当我去my_site/param/exam1 , 它重定向到my_site/example/exam1. <我知道是的redirect_canonical. 我可以删除它:

remove_action(\'template_redirect\', \'redirect_canonical\'); 
但是我的重写规则仍然不起作用-没有来自的重定向my_site/example/exam1?get=parammy_site/param/exam1.<为什么?请帮帮我。我非常需要它。

2 个回复
SO网友:bosco

术语

我想你有些术语弄混了:

URL;“重写”;更改HTTP请求的端点。如果http://example.com/param/exam1 真正提供的内容来自http://example.com/examples/exam1?get=param, 然后将前者重写为后者(尽管最终用户不一定可见)300-范围状态代码,告诉发送HTTP请求的客户端向重写的URL发送新请求(从而更改最终用户可见的地址)。如果用户输入http://example.com/param/exam1 然后将浏览器转发到http://example.com/examples/exam1?get=param, 那么前者将被重定向到后者


    重写规则分析

    乍一看,我怀疑您的RewriteRule 从不匹配您的URL;或者,如果是这样的话,就不要像你预期的那样重写它们:

    RewriteRule ^(exam1|exam2)/([^/]+)/?$ /example/$2/?get=$1 [QSA,L]
    
    匹配HTTP请求路径:^(exam1|exam2)/: beginning 具有exam1/exam2/ 和捕获exam1/exam2 作为子组$1...
  • ([^/]+): ...后跟1个或多个非-/ 将捕获为子组的字符$2...
  • /?$: ...可能后面跟着/very end./example/$2/?get=$1

    发送到的请求http://example.com/param/exam1 不会在请求路径以开始时重写param/ 而不是exam1/exam2/http://example.com/exam1/param/ 将重写以由端点提供服务http://example.com/example/param/?get=exam1http://example.com/exam1/param/test 不会被重写,因为请求路径不在之后的第一个路径段结束exam1exam2


    • 解决方案要重写指定的URL,需要交换Regex中的捕获组:

      RewriteRule ^([^/]+)/(exam1|exam2)/?$ /example/$2/?get=$1 [QSA,L]
      
      这将按照所需的顺序匹配路径段,并更正反向引用。然而,这条规则附带了一些奇怪的警告,可能会导致意外行为。实际上,要求:

      • http://example.com/foo/exam1 =&燃气轮机;http://example.com/example/exam1?get=foo
      • http://example.com/bar/exam1/ =&燃气轮机;http://example.com/example/exam1?get=bar
      • http://example.com/posts/exam2_announcement => http://example.com/example/exam2?get=posts
      • http://example.com/tests/exam120 => http://example.com/example/exam1?get=tests

SO网友:jgraup

可以在WordPress中使用add_rewrite_rule().

把这个放进去functions.php 或aplugin. 它比简单的ReWriteRule 但在WordPress方面,您将有更多的灵活性和控制力。

<?php

if ( ! class_exists( \'ExamRewrite\' ) ):

    class ExamRewrite {
        const ENDPOINT_QUERY_PARAM = \'__redirect_exam\';

        // WordPress hooks
        public function init() {
            add_filter( \'query_vars\', array ( $this, \'add_query_vars\' ), 0 );
            add_action( \'parse_request\', array ( $this, \'sniff_requests\' ), 0 );
            add_action( \'init\', array ( $this, \'add_endpoint\' ), 0 );
        }

        // Add public query vars
        public function add_query_vars( $vars ) {
            $vars[] = static::ENDPOINT_QUERY_PARAM;
            $vars[] = \'get\';
            $vars[] = \'exam\';
            return $vars;
        }

        // Add Endpoint
        public function add_endpoint() {
            add_rewrite_rule( \'^example/(exam1|exam2)\', \'index.php?\' . static::ENDPOINT_QUERY_PARAM . \'=1&exam=$matches[1]\', \'top\' );
            //////////////////////////////////
            flush_rewrite_rules( false ); //// <---------- REMOVE THIS WHEN DONE
        }

        // Sniff Requests
        public function sniff_requests( $wp_query ) {
            global $wp;

            if ( isset(
                $wp->query_vars[ static::ENDPOINT_QUERY_PARAM ],
                $wp->query_vars[ \'get\' ] ) ) {
                $get     = $wp->query_vars[ \'get\' ];
                $exam    = $wp->query_vars[ \'exam\' ];
                $new_url = site_url( "/$get/$exam" );
                wp_safe_redirect( $new_url, 301 );
                die();
            }
        }
    }

    $wpExamRewrite = new ExamRewrite();
    $wpExamRewrite->init();

endif; // ExamRewrite

相关推荐

Redirect htaccess

我需要帮助重定向我的页面。例如,我有网站https://example.com. 我需要将内容从https://example.com 到https://example.com/blog. 这不是问题,我通过更改主页URL来做到这一点。这很有效。但现在我需要添加来自旧的重定向https://example.com 到https://xmpl.com.我想用。htaccess,但这不起作用。你们能帮帮我吗?以下是我对此的一些尝试,但两者都不起作用。RewriteEngine On RewriteRu