代码之家  ›  专栏  ›  技术社区  ›  Dustin Snider

.使用WordPress插件进行htaccess重写

  •  18
  • Dustin Snider  · 技术社区  · 8 年前

    http://website.com/NAME-HERE 它会检查它是否是我数据库中的用户名,如果不是,则检查它是否是我数据库中的组,并加载与它是否是用户名或组相对应的文件。

    现在我完全不知道如何在WordPress Multisite中实现这一点。据我所知,插件无法 .htaccess

    如果不是的话,最好的方法是什么?

    我需要放置我的 pretty.php & .htaccess 重写到我的根目录并将页面指向插件中的文件?如果是这样的话,这如何与多个主题一起工作?

    .htaccess

    RewriteEngine On  
    RewriteCond %{HTTP_HOST} ^www\.(.*)$ [NC]  
    RewriteRule ^(.*)$ http://%1/$1 [R=301,L]  
    
    RewriteCond %{SCRIPT_FILENAME} !-d
    RewriteCond %{SCRIPT_FILENAME} !-f
    
    RewriteRule ^(\w.+)$ ./pretty.php?pretty=$1 [QSA]
    
    ErrorDocument 404 /404.php
    

    漂亮的php

    // First check if passed pretty parameter is a username.
    if(checkIfUserByUsername($_GET['pretty']))
    {
        $_GET['username'] = $_GET['pretty'];
        
        include("USERNAME.php");
    
    // If not a username, check to see if it's an event.
    }else if(checkIfStreamByPretty($_GET['pretty'])){
        $_GET['id'] = getStreamIdFromPretty($_GET['pretty']);
        
        include("GROUP.php");
    }else{
        // If it's none, redirect to the 404 page.
    
        include("404.php");
    }
    
    2 回复  |  直到 3 年前
        1
  •  7
  •   jgile    8 年前

    如果我理解你想要实现的目标,有几种方法可以实现。您可能不需要使用任何重写。

    最简单的解决方案是将“pretty.php”代码添加到标题中。Wordpress模板中的php文件。这将加载到网站前端的每个请求。如果您需要它只在特定页面上加载代码,只需检查您使用的是哪个页面。

    例如,在标题中。php:

    if(is_page("groups")){
      if(checkIfUserByUsername($_GET['pretty']))
      {
        // the rest of your code
      }
    }
    

    如果你想写一个Wordpress插件,你只需要在插件中使用“add_action”:

    add_action('wp_head', 'function_containing_your_code');
    

    同样,这将加载到每个页面上,因此只需检查您是否在要加载代码的页面上。

    https://codex.wordpress.org/Plugin_API/Action_Reference/wp_head https://developer.wordpress.org/reference/functions/is_page/

    此外,您还可以编辑您的。htaccess文件就像您可以编辑用户有权编辑的任何文件一样。假设您运行的是apache服务器,那么您的。htaccess文件需要具有允许编辑该文件的权限,并且您可以使用PHP编辑该文件。例如:

    $file = fopen("/path/to/.htaccess", "a+");
    fwrite($f, "RewriteRule ^(\w.+)$ ./pretty.php?pretty=$1 [QSA]");
    fclose($f);
    

    许多人会说,让PHP编写到您的应用程序是一种安全风险。htaccess文件。我想说,在某些情况下,这是真的,但肯定不总是这样。在允许PHP写入之前,请先了解权限。htaccess文件。

        2
  •  2
  •   cptnk    8 年前

    除了John Gile的回答外,请清理Get参数。你可以阅读一些消毒选项 here

    在你的问题语境中 $username = sanitize_text_field( $_GET['pretty'] ); 应该足够了。但请更深入地了解什么需要消毒。

    关于你最初的问题,约翰建议的第一种方法似乎更好。

    考虑一下,两个单独的请求使用相同的用户名请求相同的url。由于文件读取/写入是一个阻塞流,因此其中一个请求必须等待流关闭,直到这种情况发生,网站才会呈现。

    如果你用一个额外的流绕过这个问题,或者不管你有什么风险,你最终会得到重复的条目,或者更糟糕的是,一个损坏的文件,这可能会导致服务器错误。

    编辑

    我不太确定你想要通过包括 include('USERNAME.php') 您是否为每个注册“多站点网络”的用户创建了一个专用的php文件?如果是这样的话,我认为你在计划这件事时做了错误的决定。

    通常,当您想根据外部资源共享、控制或改变行为时,您可以在 JSON 数据格式。

    如果我站在你的立场,我会创造一个 REST 根据用户名get参数返回JSON并根据输入的数据控制输出的web服务。

    apigility 对于相当复杂的事情和 lumen 对于小事情。如果你愿意,也可以自己创建。

    在创建api之后,您就可以轻松地使用 file_get_contents() here 或者使用任何可以为php找到的rest工具。

    推荐文章