我有一个小型期刊的WordPress网站。它托管在Azure VM上的IIS中,并使用MSSQL而不是MySQL。虽然大部分内容都是免费提供的,但我想限制只向付费订阅者访问更新的内容。我想知道如何做到这一点。我正在考虑为每个Post / Article的slug添加一些简单的代码(也许只是让slug以' protected - '开头)。然后,我可以编写一个C#.NET HttpHandler来检查Uri是否有'受保护的'代码,检查用户是否可以通过数据库中的条目访问它,并允许或不允许访问。这种方法有用吗?任何其他可能性。
请注意,我不是PHP开发人员,任何解决方案都需要使用.NET实现。
编辑200814
我使用HttpModule查看了任何传入请求,取得了一些进展。这是通过将相关行添加到Web.config:
来实现的内部
<modules runAllManagedModulesForAllRequests="true">
<add name="WpContentAccess" type="WpJournalHttpHandler.ContentAccessModule, WpJournalHttpHandler, Version=1.0.0.0, Culture=neutral, PublicKeyToken=ced90a15f96f61ed" preCondition="managedHandler" />
</modules>
内部
<httpModules>
<add name="WpContentAccess" type="System.ServiceModel.Activation.HttpModule"/>
</httpModules>
<compilation targetFramework="4.0">
<assemblies>
<add assembly="WpJournalHttpHandler, Version=1.0.0.0, Culture=neutral, PublicKeyToken=ced90a15f96f61ed" />
</assemblies>
</compilation>
其中WpJournalHttpHandler是我的自定义HttpModule。
我希望在用户尝试查看包含&#39; protected&#39;的帖子/文章时重定向,例如https://journal.emergentpublications.com/article/protected_eco_010101/
但是,WP使用URL重写,因此我的HttpModule永远不会收到原始URL进行处理。我是否需要在URL重写之前运行HttpModule?
这是我的web.config中的重写条目:
<rewrite>
<rules>
<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>
编辑200814_2
将我的Web.config的重写部分更改为:
<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>
</rules>
</rewrite>
让我的HttpModule检查context.Request.Url.ToString()。包含(&#34; protected&#34;)作为AuthenticateRequest事件的一部分我现在可以根据需要过滤WP请求。
答案 0 :(得分:0)
看看付费会员专业版,它应该可以完成你想要的,而无需编写任何代码。
http://www.paidmembershipspro.com/
注意:我并不想卖给你什么,我只是他们产品的粉丝,并且已经在几个wordpress实现中使用它。
答案 1 :(得分:0)
添加C#.NET HttpModule最终工作。 IIS托管的WordPress站点的完整web.config是:
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<system.webServer>
<httpErrors errorMode="Detailed" />
<validation validateIntegratedModeConfiguration="false" />
<modules runAllManagedModulesForAllRequests="true">
<add name="WpContentAccess" type="WpJournalHttpHandler.ContentAccessModule, WpJournalHttpHandler, Version=1.0.0.0, Culture=neutral, PublicKeyToken=ced90a15f96f61ed" preCondition="managedHandler" />
</modules>
<rewrite>
<rules>
<rule name="wordpress" 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></rules>
</rewrite>
</system.webServer>
<system.web>
<customErrors mode="Off" />
<httpModules>
<add name="WpContentAccess" type="System.ServiceModel.Activation.HttpModule" />
</httpModules>
<compilation targetFramework="4.0">
<assemblies>
<add assembly="WpJournalHttpHandler, Version=1.0.0.0, Culture=neutral, PublicKeyToken=ced90a15f96f61ed" />
</assemblies>
</compilation>
</system.web>
</configuration>
我的ContentAccessModule的框架代码是:
using System;
using System.Web;
using System.Diagnostics;
namespace WpJournalHttpHandler
{
public class ContentAccessModule : IHttpModule
{
private EventLog eventLog;
public void Init(HttpApplication application)
{
application.AuthenticateRequest += Application_AuthenticateRequest;
if (!EventLog.SourceExists("WpJournal"))
{
EventLog.CreateEventSource("WpJournal", "WpJournalActivity");
}
eventLog = new EventLog {Source = "WpJournal"};
eventLog.WriteEntry("Application initialized.", EventLogEntryType.Information);
}
public void Dispose()
{
//Cleanup
}
private void Application_AuthenticateRequest(object source, EventArgs e)
{
HttpContext context = HttpContext.Current;
eventLog.WriteEntry("Authentication for " + context.Request.Url + " from " + context.Request.UserHostAddress, EventLogEntryType.Information);
if (context.Request.Url.ToString().Contains("protected"))
{
context.Response.Redirect("https://journal.emergentpublications.com/restricted-content/");
}
}
private bool IsValidIpAddress(string ipAddress)
{
return false;
}
private string IsSubscribed(HttpContext context)
{
return null;
}
}
}
编译完成后,WpJournalHttpHandler被加载到GAC中,因此可以通过web.config找到它。请注意,WP项目实际上是使用&#34; PHP Tools for Visual Studio 2013&#34;构建的PHP项目。现在我可以使用C#.NET为我的WP内容编写任何我想要的访问逻辑,只要我更改Post / Article的slug以包含一些常见的字符串,例如&#34; protected&#34; (我可能会使用不太可能实际出现在帖子/文章标题中的字符串 - 可能是一个简短的随机字母数字)。
请注意,如果您像我一样使用事件记录,则需要授予网络服务访问事件日志的权限。