Exemple #1
0
        /// <summary>
        ///     获取自动定向的地址,如果nginx设置了https跳转, 参考如下:
        ///     if ($server_port !~ 443){
        ///     rewrite ^(/.*)$ https://fze.net$1 permanent;
        ///     }
        /// </summary>
        /// <param name="request"></param>
        /// <returns></returns>
        public static string GetRdUrl(ICompatibleRequest request)
        {
            var host = request.GetHost();

            if (host == "localhost")
            {
                return(null);
            }
            var target = request.GetEncodedUrl();
            //if (target == null) return null;
            var forceHttps = false;

            if (Settings.SYS_FORCE_HTTPS && request.GetProto() != "https")
            {
                target     = target.Replace("http://", "https://");
                forceHttps = true;
            }

            var hostParts = host.Split('.').Length;

            // 跳转到带www的二级域名
            if (Settings.SYS_WWW_RD == 1 && hostParts == 2)
            {
                return(target.Replace(host, "www." + host));
            }

            // 跳转到不带www的顶级域名
            if (Settings.SYS_WWW_RD == 2 && host.StartsWith("www."))
            {
                return(target.Replace("www.", ""));
            }

            return(forceHttps ? target : null);
        }
Exemple #2
0
        private static CategoryDto InitCategoryDtoFromHttpPost(ICompatibleRequest form, CategoryDto category)
        {
            //form.BindToEntity(category);
            category.Keywords    = form.Form("Keywords");
            category.PageTitle   = form.Form("PageTitle");
            category.Tag         = form.Form("Tag");
            category.Name        = form.Form("Name");
            category.SortNumber  = int.Parse(form.Form("SortNumber"));
            category.Description = form.Form("Description");
            category.Location    = form.Form("Location");
            category.Icon        = form.Form("Icon");

            if (!string.IsNullOrEmpty(category.Keywords))
            {
                category.Keywords = Regex.Replace(category.Keywords, ",|\\s|\\|", ",");
            }

            //设置模板
            string categoryTplPath = form.Form("CategoryTemplate"),
                   archiveTplPath  = form.Form("CategoryArchiveTemplate");


            //如果设置了栏目视图路径,则保存
            category.CategoryTemplate = categoryTplPath;

            //如果设置了文档视图路径,则保存
            category.CategoryArchiveTemplate = archiveTplPath;

            return(category);
        }
Exemple #3
0
        /// <summary>
        /// 输出缓存内容
        /// </summary>
        /// <param name="response"></param>
        /// <param name="maxage"></param>
        /// <param name="handler"></param>
        /// <returns>是否缓存在客户端</returns>
        public static bool Output(ICompatibleResponse response, int maxage, StringCreatorHandler handler)
        {
            /*
             *     Public  指示响应可被任何缓存区缓存。
             *     Private  指示对于单个用户的整个或部分响应消息,不能被共享缓存处理。这允许服务器仅仅描述当用户的
             *     部分响应消息,此响应消息对于其他用户的请求无效。
             *     no-cache  指示请求或响应消息不能缓存(HTTP/1.0用Pragma的no-cache替换)
             *     根据什么能被缓存
             *     no-store  用于防止重要的信息被无意的发布。在请求消息中发送将使得请求和响应消息都不使用缓存。
             *     根据缓存超时
             *     max-age  指示客户机可以接收生存期不大于指定时间(以秒为单位)的响应。
             *     min-fresh  指示客户机可以接收响应时间小于当前时间加上指定时间的响应。
             *     max-stale  指示客户机可以接收超出超时期间的响应消息。如果指定max-stale消息的值,那么客户机可以
             *     接收超出超时期指定值之内的响应消息。
             *     Expires 表示存在时间,允许客户端在这个时间之前不去检查(发请求),等同max-age的
             *     效果。但是如果同时存在,则被Cache-Control的max-age覆盖。
             *     格式:
             */

            #region 获取缓存状态

            ICompatibleRequest request = HttpHosting.Context.Request;

            //现在时间
            DateTime nowTime = DateTime.Now.ToUniversalTime();
            bool     b       = request.TryGetHeader("If-Modified-Since", out var sinceModified);
            if (b)
            {
                //最后修改时间
                DateTime sinceTime;
                DateTime.TryParse(sinceModified, out sinceTime);
                sinceTime = sinceTime.ToUniversalTime();

                if ((nowTime - sinceTime).TotalSeconds < maxage)
                {
                    response.StatusCode(304);
                    // response.Status = "304 Not Modified";
                    return(true);
                }
            }

            #endregion

            #region 输出内容并缓存

            response.WriteAsync(handler());

            response.AddHeader("Cache-Control", "max-age=" + maxage.ToString());
            response.AddHeader("Last-Modified", nowTime.ToString("r"));

            #endregion

            return(false);
        }
Exemple #4
0
        public static string SaveByPostForm(ICompatibleRequest form)
        {
            var file = Cms.PhysicPath + CmsVariables.SITE_LOCALE_PATH;
            IList <LangKvPair> list = new List <LangKvPair>();
            var            row      = 0;
            var            lang     = 0;
            LangKvPair     p;
            IList <string> k1 = new List <string>();
            IList <string> v1 = new List <string>();

            foreach (var pk in form.FormKeys())
            {
                if (pk.StartsWith("k_"))
                {
                    k1.Add(pk);
                }
                else if (pk.StartsWith("f_"))
                {
                    v1.Add(pk);
                }
            }

            foreach (var k in k1)
            {
                if (int.TryParse(k.Substring(2), out row)) //获取行号
                {
                    p       = new LangKvPair();
                    p.key   = form.Form(k);
                    p.value = new Dictionary <int, string>();
                    var fPre = "f_" + row.ToString() + "_";
                    for (var j = 0; j < v1.Count; j++)
                    {
                        if (v1[j].StartsWith(fPre)) //获取对英语言的值,并移除
                        {
                            if (int.TryParse(v1[j].Substring(fPre.Length), out lang))
                            {
                                p.value[lang] = form.Form(v1[j]);
                            }
                        }
                    }
                    //v1.Remove(v1[j]);
                    list.Add(p);
                }
            }

            if (list.Count > 0)
            {
                var arr = SortLocaleList(list);
                return(FlushToFile(file, arr));
            }

            return(null);
        }
Exemple #5
0
 /// <summary>
 /// 是否通过代理https请求
 /// </summary>
 /// <param name="request"></param>
 /// <returns></returns>
 public static bool IsProxyHttpsRequest(ICompatibleRequest request)
 {
     // nginx反向代理
     if (request.GetHeader("X-Forwarded-Proto") == "https")
     {
         return(true);
     }
     // 兼容西部数码虚拟主机
     if (request.GetHeader("SSL-FLAG") == "SSL" || request.GetHeader("From-Https") == "on")
     {
         return(true);
     }
     return(false);
 }
Exemple #6
0
        /// <summary>
        /// 检查客户端缓存是否过期,如果未过期,则直接输出http 304
        /// </summary>
        /// <param name="maxAge"></param>
        /// <returns></returns>
        public static bool CheckClientCacheExpires(int maxAge)
        {
            /*
             *     Public  指示响应可被任何缓存区缓存。
             *     Private  指示对于单个用户的整个或部分响应消息,不能被共享缓存处理。这允许服务器仅仅描述当用户的
             *     部分响应消息,此响应消息对于其他用户的请求无效。
             *     no-cache  指示请求或响应消息不能缓存(HTTP/1.0用Pragma的no-cache替换)
             *     根据什么能被缓存
             *     no-store  用于防止重要的信息被无意的发布。在请求消息中发送将使得请求和响应消息都不使用缓存。
             *     根据缓存超时
             *     max-age  指示客户机可以接收生存期不大于指定时间(以秒为单位)的响应。
             *     min-fresh  指示客户机可以接收响应时间小于当前时间加上指定时间的响应。
             *     max-stale  指示客户机可以接收超出超时期间的响应消息。如果指定max-stale消息的值,那么客户机可以
             *     接收超出超时期指定值之内的响应消息。
             *     Expires 表示存在时间,允许客户端在这个时间之前不去检查(发请求),等同max-age的
             *     效果。但是如果同时存在,则被Cache-Control的max-age覆盖。
             *     格式:
             */


            if (maxAge > 0)
            {
                ICompatibleResponse response = HttpHosting.Context.Response;
                ICompatibleRequest  request  = HttpHosting.Context.Request;
                var v = request.TryGetHeader("If-Modified-Since", out var e);
                if (v)
                {
                    string sinceModified = e;
                    //现在时间
                    DateTime nowTime = DateTime.Now.ToUniversalTime();

                    //最后修改时间
                    DateTime sinceTime;
                    DateTime.TryParse(sinceModified, out sinceTime);
                    sinceTime = sinceTime.ToUniversalTime();

                    if ((nowTime - sinceTime).TotalSeconds < maxAge)
                    {
                        response.StatusCode(304);
                        //response.Status = "304 Not Modified";
                        return(false);
                    }
                }
            }

            return(true);
        }
Exemple #7
0
        /// <summary>
        /// 检查客户端缓存是否过期,如果未过期,则直接输出http 304
        /// </summary>
        /// <param name="etag"></param>
        /// <returns></returns>
        public static bool CheckClientCacheExpires(string etag)
        {
            ICompatibleRequest request = HttpHosting.Context.Request;
            var v = request.TryGetHeader("If-None-Match", out var e);

            if (v)
            {
                string clientEtag = e;
                if (String.CompareOrdinal(clientEtag, String.Concat("\"", etag, "\"")) == 0)
                {
                    ICompatibleResponse response = HttpHosting.Context.Response;
                    response.StatusCode(304);
                    //response.Status = "304 Not Modified";
                    return(false);
                }
            }

            return(true);
        }
Exemple #8
0
        public static void SaveErrorLog(Exception exception)
        {
            lock (ErrorFilePath)
            {
                ICompatibleRequest req = HttpCtx.Request;
                var path         = req.GetPath();
                var query        = req.GetQueryString();
                var PathAndQuery = path + query;
                var referer      = req.GetHeader("Referer");;
                if (!File.Exists(ErrorFilePath))
                {
                    string dir = EnvUtil.GetBaseDirectory() + "tmp/logs";
                    if (!Directory.Exists(dir))
                    {
                        Directory.CreateDirectory(dir);
                    }
                    File.Create(ErrorFilePath).Close();
                }

                HttpCtx.Response.WriteAsync((File.Exists(ErrorFilePath).ToString()));
                using (FileStream fs = new FileStream(ErrorFilePath, FileMode.Append, FileAccess.Write))
                {
                    StreamWriter  sw = new StreamWriter(fs);
                    StringBuilder sb = new StringBuilder();

                    sb.Append("---------------------------------------------------------------------\r\n")
                    .Append("[错误]:IP:").Append(HttpCtx.RemoteAddress())
                    .Append("\t时间:").Append(DateTime.Now.ToString())
                    .Append("\r\n[信息]:").Append(exception.Message)
                    .Append("\r\n[路径]:").Append(PathAndQuery)
                    .Append("  -> 来源:").Append(referer)
                    .Append("\r\n[堆栈]:").Append(exception.StackTrace)
                    .Append("\r\n\r\n");

                    sw.Write(sb.ToString());

                    sw.Flush();
                    sw.Dispose();
                    fs.Dispose();
                }
            }
        }
Exemple #9
0
        /// <summary>
        /// 上传
        /// </summary>
        /// <returns>异步则返回进程ID,同步返回上传文件的路径</returns>
        public string Upload(ICompatiblePostedFile postedFile)
        {
            ICompatibleRequest request = HttpHosting.Context.Request;
            String             baseDir = EnvUtil.GetBaseDirectory();

            string[] process   = request.Form("upload_process")[0].Split('|');
            string   processId = process[1];

            if (postedFile == null)
            {
                return(null);
            }

            string fileName = postedFile.GetFileName();
            string fileExt  = fileName.Substring(fileName.LastIndexOf('.') + 1); //扩展名

            InitUplDirectory(baseDir, this._saveAbsoluteDir);
            this._fileInfo = new UploadFileInfo
            {
                Id            = processId,
                ContentLength = postedFile.GetLength(),
                FilePath      = $"{this._saveAbsoluteDir}{this._fileName}.{fileExt}"
            };
            String targetPath = baseDir + this._fileInfo.FilePath;

            if (!this._autoRename && File.Exists(targetPath))
            {
                throw new IOException("文件已存在");
            }
            // 自动将重复的名称命名
            int i = 0;

            while (File.Exists(targetPath))
            {
                i++;
                this._fileInfo.FilePath = $"{this._saveAbsoluteDir}{this._fileName}_{i.ToString()}.{fileExt}";
                targetPath = baseDir + this._fileInfo.FilePath;
            }
            this.SaveStream(postedFile.OpenReadStream(), targetPath);
            return(_fileInfo.FilePath);
        }
Exemple #10
0
        private ArchiveDto GetFormCopyedArchive(int siteId, ICompatibleRequest form, ArchiveDto archive, string alias)
        {
            string content = form.Form("Content");

            //自动替换Tags
            if (form.Form("auto_tag") == "on")
            {
                //todo: tags 顺序调换了下

                /*
                 * HttpTags _tags = this.GetTags(siteId);
                 * content = _tags.Tags.RemoveAutoTags(content);
                 * content = _tags.Tags.ReplaceSingleTag(content);
                 */
            }

            archive.Flag = 0;
            if (form.Form("IsVisible") == "on")
            {
                archive.Flag |= (int)BuiltInArchiveFlags.Visible;
            }
            if (form.Form("AsPage") == "on")
            {
                archive.Flag |= (int)BuiltInArchiveFlags.AsPage;
            }
            if (form.Form("IsSpecial") == "on")
            {
                archive.Flag |= (int)BuiltInArchiveFlags.IsSpecial;
            }
            if (form.Form("IsSystem") == "on")
            {
                archive.Flag |= (int)BuiltInArchiveFlags.IsSystem;
            }
            archive.UpdateTime = DateTime.Now;
            archive.Title      = form.Form("Title").ToString().Trim();
            archive.SmallTitle = form.Form("SmallTitle").ToString().Trim();
            archive.Location   = form.Form("location").ToString().Trim();
            archive.Source     = form.Form("Source");
            archive.Outline    = form.Form("Outline");
            archive.Alias      = alias;
            archive.Tags       = form.Form("Tags").ToString().Replace(",", ",");
            archive.Content    = content;
            archive.Thumbnail  = form.Form("Thumbnail");

            //分类
            var categoryId = int.Parse(form.Form("categoryid"));

            archive.Category = new CategoryDto {
                ID = categoryId
            };

            //检测图片是否为默认图片
            if (archive.Thumbnail == CmsVariables.FRAMEWORK_ARCHIVE_NoPhoto)
            {
                archive.Thumbnail = string.Empty;
            }

            archive.ExtendValues = new List <IExtendValue>();

            //=============== 更新扩展字段 ===================

            IExtendField field;
            string       extendValue;

            foreach (var key in form.FormKeys())
            {
                if (key.StartsWith("extend_"))
                {
                    extendValue = form.Form(key);
                    field       = new ExtendField(int.Parse(key.Substring(7)), null);
                    archive.ExtendValues.Add(new ExtendValue(-1, field, extendValue));
                }
            }

            //更新模板设置
            archive.TemplatePath = form.Form("TemplatePath");
            if (archive.TemplatePath != string.Empty)
            {
                archive.IsSelfTemplate = true;
            }
            return(archive);
        }