我还在设置一个托管站点(使用www.mochahosting.com)。他们使用稍旧版本的相同软件:Joomla 1.5.5,php 5.2.6,mySQL 5.0.4x。他们也使用IIS7,但在Windows 32上运行。
我无法使这两个SEO设置在托管站点上工作(我已经让SEO设置在我的本地机器上工作,几乎具有相同的配置)。让我们从“搜索引擎友好URL”开始,只是为了保持简单。
此外,我目前还没有域名,因此我使用hosts文件别名来访问该网站。我不希望任何人为了回答我的问题而费这个劲,所以我将只描述问题,并希望我能够做好足够的工作,使人们能够理解发生了什么。在此问题中,我将使用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年3月3日
我认为仅打开第一个SEO设置(“搜索引擎友好的URL”)而不是(“使用Apache mod_rewrite”)可能是个坏主意(即使我可以在我的本地机器上只打开“搜索引擎友好的URL”并且它可以正常工作)。因此,我尝试了一些更多的实验。
我认为问题可能是主机上的IIS7没有正确设置URL重写。我执行了http://learn.iis.net/page.aspx/461/creating-rewrite-rules-for-the-url-rewrite-module中描述的(第一个)测试文件,并且它有效 - 这意味着URL重写正在工作。
然后,我认为问题可能是到处都可以看到的适用于Joomla在IIS7上的重写规则需要重新编写以考虑子目录。就像我上面所说的,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吗?但是,在我的本地框中,只要使用普通的重写规则,所有这些都可以正常工作,所以我可能在错误的方向上努力。
感谢您的帮助!