共享主机环境下无IIS及Application.cfm权限的ColdFusion友好URL实现求助
我太懂你从WordPress迁移到ColdFusion的糟心了——几百篇文章要从?id=XX改成友好的slug URL,还被共享主机的权限和只能用Application.cfm的限制卡着。下面是我亲测有效的分步方案,完全适配你的环境:
第一步:先把数据库准备好(核心前提)
首先得确保你的文章表有唯一的slug字段(对应WordPress里的post_name)。如果迁移时没同步这个字段,先跑个SQL语句补上:
ALTER TABLE articles ADD COLUMN slug VARCHAR(255) UNIQUE NOT NULL; -- 接着把WordPress里的post_name数据导入到这个字段,一定要保证每个slug唯一
这步是基础,毕竟我们要靠slug匹配对应的文章ID。
第二步:配置URL重写(绕开IIS权限限制)
大部分Windows共享主机哪怕不给你IIS控制台权限,也允许在根目录上传web.config文件设置简单重写规则。创建这个文件,把下面的内容粘进去:
<?xml version="1.0" encoding="UTF-8"?> <configuration> <system.webServer> <rewrite> <rules> <rule name="Blog Slug to Article CFM" stopProcessing="true"> <match url="^blog/([a-z0-9-]+)$" ignoreCase="true" /> <action type="Rewrite" url="/article.cfm?slug={R:1}" /> </rule> </rules> </rewrite> </system.webServer> </configuration>
这个规则会把/blog/article-title这类请求内部重写成article.cfm?slug=article-title,用户看不到真实的CFM路径。要是你的主机连web.config都不让用,别慌,看第三步的备用方案。
第三步:用Application.cfm搞定slug转ID(核心逻辑)
不管有没有重写规则,我们都要在Application.cfm里处理slug到ID的转换,保证原有的article.cfm不用改就能用。打开你的Application.cfm,加这段代码:
<cfscript> var currentURL = CGI.SCRIPT_NAME & CGI.QUERY_STRING; var slug = ""; // 情况1:通过web.config重写过来的,直接取URL.slug if (StructKeyExists(URL, "slug")) { slug = URL.slug; } // 情况2:主机不支持web.config,直接解析/blog/后面的路径 else if (CGI.SCRIPT_NAME CONTAINS "/blog/") { slug = ListLast(CGI.SCRIPT_NAME, "/"); // 这种情况要联系主机客服开启"通配符应用程序映射",把所有请求映射到ColdFusion的CFM处理器 } // 拿到slug后,查对应的文章ID if (slug != "") { var getArticleID = new Query(); getArticleID.setSQL("SELECT id FROM articles WHERE slug = :slug"); getArticleID.addParam(name="slug", value=slug, cfsqltype="CF_SQL_VARCHAR"); var articleResult = getArticleID.execute().getResult(); if (articleResult.recordCount == 1) { // 把ID塞回URL里,让article.cfm能直接用URL.id查询 URL.id = articleResult.id; } else { // slug不存在,跳404 include "/404.cfm"; abort; } } </cfscript>
这段代码会自动处理两种场景:要么是重写过来的?slug=xxx,要么是直接解析/blog/xxx的路径,然后把slug转成对应的ID放回URL.id里——你的article.cfm完全不用改,还是按原来的逻辑用URL.id查内容就行!
第四步:旧URL做301重定向(别丢SEO权重)
为了不浪费之前的搜索引擎排名,记得在Application.cfm里加旧URL到新URL的301跳转:
<cfif StructKeyExists(URL, "id") AND NOT StructKeyExists(URL, "slug")> <cfquery name="getSlug" datasource="#你的数据源名称#"> SELECT slug FROM articles WHERE id = #URL.id# </cfquery> <cfif getSlug.recordCount == 1> <cfheader statuscode="301" statustext="Moved Permanently"> <cfheader name="Location" value="https://www.testsite.com/blog/#getSlug.slug#"> <cfabort> </cfif> </cfif>
这样用户或者搜索引擎访问旧的article.cfm?id=32时,会自动跳转到新的友好URL。
第五步:测试验证
- 访问
https://www.testsite.com/blog/你的文章slug,确认能正常显示对应文章 - 打开旧URL
https://www.testsite.com/article.cfm?id=32,确认能301跳转到新URL - 输一个不存在的slug,确认能显示404页面
内容的提问来源于stack exchange,提问作者Cheryl

