Wordpress在自定义重写规则上给出随机404

时间:2015-03-20 21:56:39

标签: php wordpress rewrite

我有一个网站为触发用Wordpress编写的自定义重写的页面提供间歇性(但很少见)的404错误。漂亮的URL大部分时间都可以工作,刷新页面会使它正确加载,如果它是404。

使用以下函数重写了链接:

function my_post_type_link( $link, $post = 0 )
{               
    $type = $post->post_type;
    switch( $type ) 
    {
        case 'sfwd-courses':    //Change Courses links to Modules
           return home_url( 'module/' . $post->ID . '/' . $post->post_name );
        case 'sfwd-lessons':    //Change Lessons links to Focuses
           return home_url( 'focus/' . $post->ID . '/' . $post->post_name );
        case 'sfwd-topic':      //Change Topics links to Lessons
           return home_url( 'lesson/' . $post->ID . '/' . $post->post_name );
        case 'my_course':      
           return home_url( 'course/' . $post->ID . '/' . $post->post_name );
        default:
            return $link; 
    }
}

这可以按预期工作。

然后我用以下内容重写这些新链接:

function my_rewrites_init()
{           
    flush_rewrite_rules();
    add_rewrite_rule('module/([0-9]+)/([^/]*)?$', 'index.php?post_type=sfwd-courses&p=$matches[1]&name=$matches[2]' , 'top');
    add_rewrite_rule('focus/([0-9]+)/([^/]*)?$', 'index.php?post_type=sfwd-lessons&p=$matches[1]&name=$matches[2]' , 'top');
    add_rewrite_rule('lesson/([0-9]+)/([^/]*)?$', 'index.php?post_type=sfwd-topic&p=$matches[1]&name=$matches[2]' , 'top');
    add_rewrite_rule('course/([0-9]+)/([^/]*)?$', 'index.php?post_type=aha_course&p=$matches[1]&name=$matches[2]' , 'top');
}
add_action( 'init', 'my_rewrites_init');
到目前为止我看到的服务器日志只是在重写的链接上报告了404,但是访问失败的链接会有效。

我不确定我是否在重写功能中遗漏了某些内容,或者问题可能在其他地方。永久链接已经重新创建,但仍然获得随机404。

我只在我的本地WAMP开发服务器上触发过404次,但生产服务器更频繁地执行此操作。产品服务器是IIS。

感谢您的帮助。

1 个答案:

答案 0 :(得分:1)

如果您尚未为IIS配置web.config,请执行以下操作添加以下代码: UPDATE:

   <rewrite>
      <rules><rule name="WordPress Rule" stopProcessing="true"><match url=".*"/><conditions><add input="{REQUEST_FILENAME}" matchType="IsFile" negate="true"/><add input="{REQUEST_FILENAME}" matchType="IsDirectory" negate="true"/></conditions><action type="Rewrite" url="index.php?page_id={R:0}"/></rule>
            <rule name="wordpress" patternSyntax="Wildcard">
                <match url="*"/>
                    <conditions>
                        <add input="{REQUEST_FILENAME}" matchType="IsFile" negate="true"/>
                        <add input="{REQUEST_FILENAME}" matchType="IsDirectory" negate="true"/>
                    </conditions>
                <action type="Rewrite" url="index.php"/>
            </rule></rules>
    </rewrite>

此外,如果您在漂亮的链接(文章标题)中使用任何非拉丁符号,请添加wp-config.php此代码:

if ( isset($_SERVER['UNENCODED_URL']) ) {
$_SERVER['REQUEST_URI'] = $_SERVER['UNENCODED_URL'];
}