我在 vista 64 开发盒上的 IIS7 上运行 Joomla 1.5.9 和 php 5.2.8、mySQL 5.1.31。我的 SEO 设置“搜索引擎友好 URL”和“使用 Apache mod_rewrite”都正常工作。
我还在建立一个托管站点(使用 www.mochahosting.com)。他们使用相同软件的稍旧版本:Joomla 1.5.5、php 5.2.6、mySQL 5.0.4x。他们也使用 IIS7,但在 Windows 32 上运行。
我无法让任何 SEO 设置在托管站点上工作(我已经让 SEO 设置在我的本地机器上工作,配置几乎相同)。让我们从“搜索引擎友好的 URL”开始,只是为了让事情变得简单。
另外,我还没有域名,所以我使用主机文件别名来访问该站点。我不希望任何人遇到麻烦来回答我的问题,所以我只会描述这个问题,并希望我做得足够好,让人们能够理解正在发生的事情。出于此问题的目的,我将使用http://nodomainyet.com/joomla156_mx作为基本 URL(即 joomla 主页)。是的,这确实意味着 Joomla 安装在一个子目录中——我不确定这是否是一个问题(这在我的开发盒上不是问题)。
关于问题。
打开“搜索引擎友好 URL”会导致http://nodomainyet.com/joomla156_mx生成 404(“找不到组件”)。在 404 错误页面中有一个指向 http://nodomainyet.com/joomla156_mx/index.php的链接——该链接有效。如果我关闭“搜索引擎友好 URL”,那么http://nodomainyet.com/joomla156_mx和http://nodomainyet.com/joomla156_mx/index.php都可以工作。因此,似乎打开“搜索引擎友好 URL”会导致http://nodomainyet.com/joomla156_mx到http://nodomainyet.com/joomla156_mx/index.php的“自动重定向”停止工作......
现在,如果我访问http://nodomainyet.com/joomla156_mx/index.php并从那里导航到各种主菜单链接(我只使用安装了新 Joomla 实例的默认 joomla 站点),然后一切正常。它只是去http://nodomainyet.com/joomla156_mx不起作用。值得注意的是,主菜单中的“主页”链接默认指向http://nodomainyet.com/joomla156_mx。
我已经将主机上 phpinfo 的输出与我的开发箱的输出进行了比较,并且看不到任何会导致此问题的差异...
打开第二个 SEO 设置——“使用 Apache mod_rewrite”——并不能解决问题(人们会认为它可能,因为该设置的目的是摆脱 URL 中的 index.php)。
“搜索引擎友好的 URL”通常看起来很简单——它不需要 web.config 和重写规则......我不确定是什么可能导致它出错。
更新 - 2009-03-03
我认为仅从(“使用 Apache mod_rewrite”)打开第一个 SEO 设置(“搜索引擎友好 URL”)可能是个坏主意(即使我可以自己打开“搜索引擎友好 URL”)本地机器,它工作正常)。所以我尝试了更多的实验
我认为问题可能是在主机上的 IIS7 中没有正确设置 URL 重写。我做了http://learn.iis.net/page.aspx/461/creating-rewrite-rules-for-the-url-rewrite-module中描述的(第一个)测试文件并且有效 - 这意味着 URL重写工作。
然后我想也许问题在于人们在 IIS7 上随处可见的 Joomla 的重写规则需要重写以考虑子目录。就像我上面说的,SEO 设置在我的本地机器上运行良好。Joomla 也安装在子目录中,一切正常。不过,我尝试从
<rewrite>
<rules>
<rule name="Imported Rule 1" enabled="true">
<match url="(.*)" ignoreCase="false" />
<conditions logicalGrouping="MatchAll">
<add input="{REQUEST_FILENAME}" matchType="IsFile" negate="true" pattern="" ignoreCase="false" />
<add input="{REQUEST_FILENAME}" matchType="IsDirectory" negate="true" pattern="" ignoreCase="false" />
<add input="{SCRIPT_NAME}" negate="true" pattern="^/index.php" ignoreCase="false" />
<add input="{SCRIPT_NAME}" pattern="(/|\.php|\.html|\.htm|\.feed|\.pdf|\.raw|/[^.]*)$" />
</conditions>
<action type="Rewrite" url="index.php" />
</rule>
</rules>
</rewrite>
到
<rewrite>
<rules>
<rule name="Imported Rule 1" enabled="true">
<match url="(.*)" ignoreCase="false" />
<conditions logicalGrouping="MatchAll">
<add input="{REQUEST_FILENAME}" matchType="IsFile" negate="true" pattern="" ignoreCase="false" />
<add input="{REQUEST_FILENAME}" matchType="IsDirectory" negate="true" pattern="" ignoreCase="false" />
<add input="{SCRIPT_NAME}" negate="true" pattern="^/joomla156mx/index.php" ignoreCase="false" />
<add input="{SCRIPT_NAME}" pattern="(/|\.php|\.html|\.htm|\.feed|\.pdf|\.raw|/[^.]*)$" />
</conditions>
<action type="Rewrite" url="joomla156mx/index.php" />
</rule>
</rules>
</rewrite>
(即,将目录名称添加到条件和操作)。这并没有什么不同。现在,我对重写规则完全陌生,所以我可能搞砸了一些东西。
我想我觉得没有重定向规则有点可疑;这意味着如果我复制并粘贴一个“重写”的 URL,是否必须告诉服务器这是一个虚构的 URL,它应该被重定向到一个真实的 URL?但是,再一次,这一切都在我的本地机器上运行良好,使用普通的旧重写规则,所以我可能在错误的树上吠叫。
谢谢您的帮助!