> 博客 > 网站优化技巧 > Discuz伪静态失效解决方法(最有效排错方案)

Discuz伪静态失效解决方法(最有效排错方案)

     2018-01-30  点击:5634次

1516065043970401.jpg

Discuz!经常会遇到伪静态配置不生效,更换模板之后失效等问题,下面给出终极有效解决discuz伪静态失效的排查方案。

一、确认后台已开启URL静态化

在后台——全局——SEO设置——URL静态化中开启对应页面的静态化,注意:如果开启[仅对游客有效],那么登录的用户,是无法看到URL伪静态的,可以在浏览器的隐身窗口测试效果。

二、确认web服务器已配置伪静态规则

伪静态规则可以通过【查看当前的 Rewrite 规则URL 静态化】按钮查看,不同的web服务器的伪静态规则完全不同。如果没有更改为URL格式,默认的伪静态规则如下:

Apache Web Server(独立主机用户)

<IfModule mod_rewrite.c>
	RewriteEngine On
	RewriteCond %{QUERY_STRING} ^(.*)$
	RewriteRule ^(.*)/topic-(.+)\.html$ $1/portal.php?mod=topic&topic=$2&%1
	RewriteCond %{QUERY_STRING} ^(.*)$
	RewriteRule ^(.*)/article-([0-9]+)-([0-9]+)\.html$ $1/portal.php?mod=view&aid=$2&page=$3&%1
	RewriteCond %{QUERY_STRING} ^(.*)$
	RewriteRule ^(.*)/forum-(\w+)-([0-9]+)\.html$ $1/forum.php?mod=forumdisplay&fid=$2&page=$3&%1
	RewriteCond %{QUERY_STRING} ^(.*)$
	RewriteRule ^(.*)/thread-([0-9]+)-([0-9]+)-([0-9]+)\.html$ $1/forum.php?mod=viewthread&tid=$2&extra=page\%3D$4&page=$3&%1
	RewriteCond %{QUERY_STRING} ^(.*)$
	RewriteRule ^(.*)/(fid|tid)-([0-9]+)\.html$ $1/archiver/index.php?action=$2&value=$3&%1
</IfModule>


Apache Web Server(虚拟主机用户)

# 将 RewriteEngine 模式打开
RewriteEngine On

# 修改以下语句中的 /discuz 为您的论坛目录地址,如果程序放在根目录中,请将 /discuz 修改为 /
RewriteBase /discuz

# Rewrite 系统规则请勿修改
RewriteCond %{QUERY_STRING} ^(.*)$
RewriteRule ^topic-(.+)\.html$ portal.php?mod=topic&topic=$1&%1
RewriteCond %{QUERY_STRING} ^(.*)$
RewriteRule ^article-([0-9]+)-([0-9]+)\.html$ portal.php?mod=view&aid=$1&page=$2&%1
RewriteCond %{QUERY_STRING} ^(.*)$
RewriteRule ^forum-(\w+)-([0-9]+)\.html$ forum.php?mod=forumdisplay&fid=$1&page=$2&%1
RewriteCond %{QUERY_STRING} ^(.*)$
RewriteRule ^thread-([0-9]+)-([0-9]+)-([0-9]+)\.html$ forum.php?mod=viewthread&tid=$1&extra=page\%3D$3&page=$2&%1
RewriteCond %{QUERY_STRING} ^(.*)$
RewriteRule ^(fid|tid)-([0-9]+)\.html$ archiver/index.php?action=$1&value=$2&%1



IIS Web Server(独立主机用户)
[ISAPI_Rewrite]

# 3600 = 1 hour
CacheClockRate 3600

RepeatLimit 32

# Protect httpd.ini and httpd.parse.errors files
# from accessing through HTTP
RewriteRule ^(.*)/topic-(.+)\.html(\?(.*))*$ $1/portal\.php\?mod=topic&topic=$2&$4
RewriteRule ^(.*)/article-([0-9]+)-([0-9]+)\.html(\?(.*))*$ $1/portal\.php\?mod=view&aid=$2&page=$3&$5
RewriteRule ^(.*)/forum-(\w+)-([0-9]+)\.html(\?(.*))*$ $1/forum\.php\?mod=forumdisplay&fid=$2&page=$3&$5
RewriteRule ^(.*)/thread-([0-9]+)-([0-9]+)-([0-9]+)\.html(\?(.*))*$ $1/forum\.php\?mod=viewthread&tid=$2&extra=page\%3D$4&page=$3&$6
RewriteRule ^(.*)/(fid|tid)-([0-9]+)\.html(\?(.*))*$ $1/archiver/index\.php\?action=$2&value=$3&$5


IIS7 Web Server(独立主机用户)
<rewrite>
	<rules>
		<rule name="portal_topic">
			<match url="^(.*/)*topic-(.+).html\?*(.*)$" />
			<action type="Rewrite" url="{R:1}/portal.php\?mod=topic&amp;topic={R:2}&amp;{R:3}" />
		</rule>
		<rule name="portal_article">
			<match url="^(.*/)*article-([0-9]+)-([0-9]+).html\?*(.*)$" />
			<action type="Rewrite" url="{R:1}/portal.php\?mod=view&amp;aid={R:2}&amp;page={R:3}&amp;{R:4}" />
		</rule>
		<rule name="forum_forumdisplay">
			<match url="^(.*/)*forum-(\w+)-([0-9]+).html\?*(.*)$" />
			<action type="Rewrite" url="{R:1}/forum.php\?mod=forumdisplay&amp;fid={R:2}&amp;page={R:3}&amp;{R:4}" />
		</rule>
		<rule name="forum_viewthread">
			<match url="^(.*/)*thread-([0-9]+)-([0-9]+)-([0-9]+).html\?*(.*)$" />
			<action type="Rewrite" url="{R:1}/forum.php\?mod=viewthread&amp;tid={R:2}&amp;extra=page%3D{R:4}&amp;page={R:3}&amp;{R:5}" />
		</rule>
		<rule name="forum_archiver">
			<match url="^(.*/)*(fid|tid)-([0-9]+).html\?*(.*)$" />
			<action type="Rewrite" url="{R:1}/archiver/index.php\?action={R:2}&amp;value={R:3}&amp;{R:4}" />
		</rule>
	</rules>
</rewrite>


Zeus Web Server
match URL into $ with ^(.*)/topic-(.+)\.html\?*(.*)$
if matched then
	set URL = $1/portal.php?mod=topic&topic=$2&$3
endif
match URL into $ with ^(.*)/article-([0-9]+)-([0-9]+)\.html\?*(.*)$
if matched then
	set URL = $1/portal.php?mod=view&aid=$2&page=$3&$4
endif
match URL into $ with ^(.*)/forum-(\w+)-([0-9]+)\.html\?*(.*)$
if matched then
	set URL = $1/forum.php?mod=forumdisplay&fid=$2&page=$3&$4
endif
match URL into $ with ^(.*)/thread-([0-9]+)-([0-9]+)-([0-9]+)\.html\?*(.*)$
if matched then
	set URL = $1/forum.php?mod=viewthread&tid=$2&extra=page\%3D$4&page=$3&$5
endif
match URL into $ with ^(.*)/(fid|tid)-([0-9]+)\.html\?*(.*)$
if matched then
	set URL = $1/archiver/index.php?action=$2&value=$3&$4
endif


Nginx Web Server
rewrite ^([^\.]*)/topic-(.+)\.html$ $1/portal.php?mod=topic&topic=$2 last;
rewrite ^([^\.]*)/article-([0-9]+)-([0-9]+)\.html$ $1/portal.php?mod=view&aid=$2&page=$3 last;
rewrite ^([^\.]*)/forum-(\w+)-([0-9]+)\.html$ $1/forum.php?mod=forumdisplay&fid=$2&page=$3 last;
rewrite ^([^\.]*)/thread-([0-9]+)-([0-9]+)-([0-9]+)\.html$ $1/forum.php?mod=viewthread&tid=$2&extra=page%3D$4&page=$3 last;
rewrite ^([^\.]*)/(fid|tid)-([0-9]+)\.html$ $1/archiver/index.php?action=$2&value=$3 last;
if (!-e $request_filename) {
	return 404;
}

三、错误排查

如果确认上面两点操作无误,但还是不行。首先使用伪静态后的URL访问一下,如果可以访问,那说明系统配置没问题,只是模板不支持。不支持伪静态的模板,通常是common/footer.htm中缺少下面代码:

<!--{eval output();}-->

将代码复制到footer.htm中,</body>上面一行即可。


相关文章