在IIS7上Joomla搜索引擎友好的URL问题

3
我正在运行Joomla 1.5.9,使用php 5.2.8和mySQL 5.1.31,在vista 64开发盒上的IIS7上。我的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”开始,只是为了保持简单。
此外,我目前还没有域名,因此我使用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_mxhttp://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吗?但是,在我的本地框中,只要使用普通的重写规则,所有这些都可以正常工作,所以我可能在错误的方向上努力。
感谢您的帮助!
4个回答

2
这个页面的最后一步是通过启用搜索引擎友好的URL来实现。默认情况下,Joomla为网站生成的所有链接URL使用查询字符串参数。可以通过启用Joomla中称为“搜索引擎友好的URL”的功能来更改此行为。但是,此功能依赖于Web服务器上可用的URL重写功能。IIS 6.0没有URL重写功能,因此您可以使用第三方URL重写产品之一,例如ISAPI_Rewrite或Ionics ISAPI Rewrite Filter。IIS 7.0具有URL重写支持,可以通过安装Microsoft URL Rewrite Module for IIS 7.0来启用。以下说明描述了如何使用URL Rewrite Module for IIS 7.0来在Joomla中启用Clean URLs。
首先,您需要下载并安装Microsoft URL Rewrite Module。安装完成后,在C:\inetpub\wwwroot\Joomla文件夹中创建和打开一个web.config文件。将以下XML代码粘贴到此文件中。
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
  <system.webServer>
    <rewrite>
      <rules>
        <rule name="Security Rule" stopProcessing="true">
          <match url="^(.*)$" ignoreCase="false" />
          <conditions logicalGrouping="MatchAny">
            <add input="{QUERY_STRING}" pattern="mosConfig_[a-zA-Z_]{1,21}(=|\%3D)" ignoreCase="false" />
            <add input="{QUERY_STRING}" pattern="base64_encode.*\(.*\)" ignoreCase="false" />
            <add input="{QUERY_STRING}" pattern="(\&lt;|%3C).*script.*(\>|%3E)" />
            <add input="{QUERY_STRING}" pattern="GLOBALS(=|\[|\%[0-9A-Z]{0,2})" ignoreCase="false" />
            <add input="{QUERY_STRING}" pattern="_REQUEST(=|\[|\%[0-9A-Z]{0,2})" ignoreCase="false" />
          </conditions>
          <action type="CustomResponse" url="index.php" statusCode="403" statusReason="Forbidden" statusDescription="Forbidden" />
        </rule>
        <rule name="SEO Rule">
          <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="{URL}" negate="true" pattern="^/index.php" ignoreCase="false" />
            <add input="{URL}" pattern="(/|\.php|\.html|\.htm|\.feed|\.pdf|\.raw|/[^.]*)$" />
          </conditions>
          <action type="Rewrite" url="index.php" />
        </rule>
      </rules>
    </rewrite>
 </system.webServer>
</configuration>

保存web.config文件,然后打开Web浏览器并登录到Joomla管理员控制台,网址是http://localhost/joomla/administrator/。登录后,转到【站点】-->【全局配置】菜单,并按以下方式配置SEO设置:

  • 启用搜索引擎友好的URL - 是
  • 使用Apache mod_rewrite - 是
  • 给URL添加后缀 - 否
  • 点击"应用"按钮保存配置,然后浏览到http://localhost/joomla/。现在您会看到Joomla页面中的所有链接都没有查询字符串参数的URL地址,如果您单击其中任何一个链接,服务器将返回正确的响应:


    谢谢您的回答。然而,我已经在本地机器和托管站点上按照类似的说明进行了操作;它在我的本地机器上可以工作,但在托管站点上无法工作...因此,我需要更多关于如何在托管站点上诊断此问题的详细信息。 - Jimmy

    2
    原来问题在于托管公司没有使用FastCGI来运行php。即使在运行phpinfo()时显示“Server API = CGI/FastCGI”,这仍然不足以保证正在使用fastcgi。
    使用CGI或ISAPI有什么问题?它们都存在与joomla SEO使用的php变量_SERVER["REQUEST_URI"]相关的问题。
    请参阅我的另一个问题,了解如何确定是否确实正在使用FastCGI:如何确定是否确实正在使用FastCGI来运行php脚本

    0

    我不确定这个问题是否已经解决了,我查过了但是我可能漏掉了什么。

    如果您的搜索引擎友好链接存在问题,请进入 Joomla 安装目录下的文件夹,并将您的 htaccess.txt 文件重命名为 .htaccess

    这应该可以解决 404 错误的问题。


    .htaccess 不被 IIS7 使用。 - rtpHarry

    0

    我有一个网站www.carooolglobal.com,所有功能在将所有SEO设置为No时都可以正常工作。

    如果我将任何SEO设置更改为Yes,并从主页左侧的搜索表单执行搜索,则会正确显示index.php上的结果。但是,当我从搜索结果中点击名称链接时,它应该在弹出窗口中打开个人资料,但弹出窗口显示:

    您可能无法访问此页面,因为:

    书签/收藏夹过时 搜索引擎已过时的网站列表 地址错误 您无权访问此页面 请求的资源未找到。 处理您的请求时发生错误。 请尝试以下页面:

    首页

    如果问题仍然存在,请联系此站点的系统管理员。

    我一筹莫展

    敬礼 Kislay


    网页内容由stack overflow 提供, 点击上面的
    可以查看英文原文,
    原文链接