Wordpress页面地址重写

问题描述 投票:0回答:4

更新

我尝试使用内部 WordPress 重写。我要做的是这样的地址:

http://example.com/galleria/artist-name

发送到

gallery.php
页面,其中包含包含
artist-name
的变量。

我按照 WordPress 文档使用了这些规则:

// REWRITE RULES (per gallery) {{{
add_filter('rewrite_rules_array','wp_insertMyRewriteRules');
add_filter('query_vars','wp_insertMyRewriteQueryVars');
add_filter('init','flushRules');

// Remember to flush_rules() when adding rules
function flushRules(){
    global $wp_rewrite;
    $wp_rewrite->flush_rules();
}

// Adding a new rule
function wp_insertMyRewriteRules($rules)
{
    $newrules = array();
    $newrules['(galleria)/(.*)$'] = 'index.php?pagename=gallery&galleryname=$matches[2]';
    return $newrules + $rules;
}

// Adding the id var so that WP recognizes it
function wp_insertMyRewriteQueryVars($vars)
{
    array_push($vars, 'galleryname');
    return $vars;
}

现在奇怪的是,在我的本地 WordPress 测试安装上,效果很好:调用图库页面并传递

galleryname
变量。另一方面,在真实网站上,初始 URL 被接受(因为它不会进入 404),但它会更改为
http://example.com/gallery
(我的意思是它实际上在浏览器的地址栏中发生了变化)并且变量是
gallery.php
中未定义。

知道什么可能导致这种不同的行为吗?

或者,我想不出任何其他方法可以达到前三行中描述的相同效果,也完全可以。


老问题

我需要做的是重写这个地址:

(1) http://localhost/wordpress/fake/text-value

(2) http://localhost/wordpress/gallery?somevar=text-value

备注:

  • 重新映射必须是透明的:用户始终必须看到地址
    (1)
  • gallery
    是 WordPress 页面的永久链接,而不是真实地址

我基本上需要先重写地址(修改它),然后再次将其反馈给mod rewrite(让wordpress以自己的方式解析它)。

问题

如果我只是这样做

RewriteRule ^fake$ http://localhost/wordpress/gallery [L]

它可以工作,但是浏览器中的地址发生了变化,如果我这样做了,那就不好了

RewriteRule ^fake$ /wordpress/gallery [L]

我得到了 404。我尝试了不同的标志而不是

[L]
但无济于事。我怎样才能让它发挥作用?

编辑:完整的.htaccess

# BEGIN WordPress
<IfModule mod_rewrite.c>
RewriteEngine On

RewriteRule ^fake$ /wordpress/gallery [R]

RewriteBase /wordpress/
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /wordpress/index.php [L]
</IfModule>

# END WordPress
php wordpress mod-rewrite url-rewriting
4个回答
1
投票

尝试这个规则:

RewriteRule ^fake/([^/]+)$ gallery?somevar=$1 [L]

1
投票

已解决,这是Permalink Redirect插件,需要配置为跳过所需的“虚拟”URL,否则会发出 301 永久移动。


0
投票

对这里非常延迟的答案表示歉意,但我相信您需要做的是 Gumbo 建议的,但添加了 添加 passthrough/PT 标志

该标志强制重写引擎将内部 request_rec 结构的 uri 字段设置为 filename 字段的值。
...
如果您想混合来自允许 URL 到文件名转换器的不同模块的指令,则必须使用此标志。

虽然 WordPress(通过 mod_php)在 mod_rewrite 完成后运行,但它通常会获取原始(重写前)uri,并使用它来进行自己的内部重写,而不是重写的文件名值。

所以尝试一下:

RewriteRule ^fake/([^/]+)$ gallery?somevar=$1 [QSA,PT]

我添加了 QSA,这样万一有人访问 /wordpress/fake/something?page=3,它就会正确传递。 让我知道它是如何工作的。


-1
投票
  1. 使用您最喜欢的 HTML/PHP 编辑器,打开

    wp-admin/includes/misc.php

  2. 查找函数 function

    got_mod_rewrite
    大约在第 18 行左右。

  3. 注释掉现有函数:

    /* this is commented out */
    — 如果您确定解决方案有效,可以删除此函数,但为了安全起见,只需将其注释掉,以防需要将其放回去。

  4. 添加以下内容:

    function got_mod_rewrite() {
        $got_rewrite = true;
        return apply_filters(‘got_rewrite’, $got_rewrite);
    }
    
  5. 保存并上传。

© www.soinside.com 2019 - 2024. All rights reserved.