如何将WordPress子目录中的所有404重定向到该子目录的index.php?

时间:2015-11-25 作者:Adi

我有一个名为的文件夹:

wordpress_install/dev/abc
现在,我创建了一个索引。abc文件夹中的php,我想要所有URL,如:

wordpress_install/dev/abc/asdfasdfsdf (a 404 page)
要重定向到

wordpress_install/dev/abc/index.php
我的动机是,任何请求(404或任何其他请求)都应该转到索引。子文件夹中的php。但是,最初的wordpress应该按原样运行。

我现在。子文件夹中的htaccess是:

RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^([^?]*)$ /index.php?path=$1 [NC,L,QSA]
ErrorDocument 404 /index.php
Wordpress。htaccess保持原样。

5 个回复
最合适的回答,由SO网友:jgraup 整理而成

可以使用自定义端点。只需确保在添加/更改重写规则后刷新它,而不是每次加载页面!

这将改变http://yoursite.com/dev/abc/asdfasdfsdf 进入http://yoursite.com/dev/abc/index.php?whatever_you_want_your_index_to_see=asdfasdfsdf

有关重写规则的详细信息:http://code.tutsplus.com/articles/the-rewrite-api-the-basics--wp-25474.

添加重写规则后,如add_rewrite_rule(\'^dev/abc/([^/]+)/?$\', \'index.php?\'.self::ENDPOINT_SYMBOL.\'=1&\' . self::ENDPOINT_PARAM . \'=$matches[1]\', \'top\'); 您可以使用这个很棒的插件来检查regex的工作情况:https://wordpress.org/plugins/monkeyman-rewrite-analyzer/

<?php

////////////////////////////////////////////////////////////////////////////////////////

/**
 *      ONLY DO THIS ONCE!!!!! LIKE AFTER A THEME SWITCH
 *      FOR THIS DEMO --- MAKE SURE IT\'S WORKING FIRST -- THEN COMMENT THIS OUT!!!
 */
function for_demo_only_after_endpoint_added()
{
    flush_rewrite_rules(false);
}
add_action(\'init\', \'for_demo_only_after_endpoint_added\', 99 );


////////////////////////////////////////////////////////////////////////////////////////

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

    class ExampleEndpoint
    {

        const ENDPOINT_SYMBOL = \'__dev/abc__\';
        const ENDPOINT_PARAM = \'special_var\';

        public function __construct()
        {
            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);
        }

        public function add_query_vars($vars)
        {
            $vars[] = self::ENDPOINT_SYMBOL; // use to snif the request
            $vars[] = self::ENDPOINT_PARAM;
            return $vars;
        }

        public function add_endpoint()
        {
            // if you change this, you\'ll need to flush the rewrite rules!
            add_rewrite_rule(\'^dev/abc/([^/]+)/?$\', \'index.php?\' . self::ENDPOINT_SYMBOL . \'=1&\' . self::ENDPOINT_PARAM . \'=$matches[1]\', \'top\');
        }

        public function sniff_requests()
        {
            global $wp;
            if (isset($wp->query_vars[self::ENDPOINT_SYMBOL])) {
                $this->handle_request();
                exit;
            }
        }

        protected function handle_request()
        {
            global $wp;
            $request_args = array();

            // gather your variables
            if (isset($wp->query_vars[self::ENDPOINT_PARAM])) {
                $request_args[self::ENDPOINT_PARAM] = $wp->query_vars[self::ENDPOINT_PARAM];
            }

            // redirect to your index.php page - add the extra info as query args
            $location = home_url($path = \'/dev/abc/index.php?\' .
                \'whatever_you_want_your_index_to_see=\' . $request_args[self::ENDPOINT_PARAM], $scheme = \'http\');


            // go now!
            $status = 301;
            wp_redirect($location, $status);
            exit; // fin
        }

    }

    $ep = new ExampleEndpoint();

endif;
在索引中。php您可以检查查询变量是否通过;

<?php

echo "You made it!<pre>";

var_dump($_REQUEST);

echo "<pre>";

SO网友:Kvvaradha

不要太复杂。只需打开活动主题404.php 和使用wp_safe_redirect 并打开主页。下面是示例代码。

   <?php // 404.php

          wp_safe_redirect(home_url()); 

     ?>
我想这解决了你的问题。

SO网友:Mark Kaplun

按照wordpress默认htaccess指定的执行顺序,apache首先检查服务器上是否存在与URL匹配的文件,如果没有,则运行wordpress来解析URL。因此,可以安全地假设任何dev/abc/*类型的URL都会报告一个未找到的文件。

您可以做的是匹配$_SERVER[\'REQUEST_URI\'] 根据该模式,如果匹配,则重定向到/dev/abc/index。php。

实际上有几个301重定向插件应该能够进行这种模式匹配和重定向。

SO网友:Mark Kaplun

另一种选择是将您的目录排除在wordpress htaccess规则之外。

(在我喝4杯咖啡之前,我的htaccess魔力很弱,所以这是我在一天中的这个时候能喝到的最深的咖啡)

SO网友:Ni3

站点和子目录已添加到以下代码中:

博客url设置为http://www.domain.com/subdirectory

主页Urlhttp://www.domain.com

htaccess
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /subdirectory/
RewriteRule ^index\\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /subdirectory/index.php [L]
</IfModule>

相关推荐

无法在模板函数.php中使用IS_HOME

我试图在标题中加载一个滑块,但只在主页上加载。如果有帮助的话,我正在使用Ultralight模板。我正在尝试(在template functions.php中)执行以下操作:<?php if ( is_page( \'home\' ) ) : ?> dynamic_sidebar( \'Homepage Widget\' ); <?php endif; ?> 但这行不通。现在,通过快速的google,我似乎需要将请