代码之家  ›  专栏  ›  技术社区  ›  Matteo Riva

WordPress页面地址重写

  •  4
  • Matteo Riva  · 技术社区  · 14 年前

    更新

    我尝试使用内部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测试安装中,它运行良好:调用了Gallery页面,并且 galleryname 变量已传递。另一方面,在真实的站点上,初始的URL被接受(就像它不进入404一样),但它变为 http://example.com/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
    
    4 回复  |  直到 12 年前
        1
  •  1
  •   Gumbo    14 年前

    尝试此规则:

    RewriteRule ^fake/([^/]+)$ gallery?somevar=$1 [L]
    
        2
  •  1
  •   Matteo Riva    14 年前

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

        3
  •  0
  •   Conspicuous Compiler    14 年前

    很抱歉这里的回答很晚,但我相信你需要做的是秋葵汤的建议,但是 the addition of the passthrough/PT flag :

    此标志强制重写引擎将内部请求记录结构的uri字段设置为文件名字段的值。

    如果要混合来自不同模块的指令(允许URL到文件名转换器),则必须使用此标志。

    虽然wordpress(via mod_php)在mod_rewrite完成后运行,但它通常会得到原始(预重写)uri,并使用它自己的内部重写,而不是重新写入的文件名值。

    所以尝试一下:

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

    我加了qsa,以防有人去/wordpress/fake/something?page=3,会正确传递。让我知道这是怎么回事。

        4
  •  -1
  •   mbinette    12 年前
    1. 使用您最喜欢的HTML/PHP编辑器,打开 wp-admin/includes/misc.php

    2. 查找函数函数 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. 保存并上传。