我有一个网站为触发用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。
感谢您的帮助。
答案 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'];
}