关于IIS7的Joomla搜索引擎友好URL问题

关于IIS7的Joomla搜索引擎友好URL问题,iis,iis-7,seo,joomla,friendly-url,Iis,Iis 7,Seo,Joomla,Friendly Url,我让Joomla 1.5.9在Vista64开发设备的IIS7上运行PHP5.2.8和mySQL 5.1.31。我有两个SEO设置“搜索引擎友好的URL”和“使用Apache mod_重写”工作正常 我还在建立一个托管网站(www.mochahosting.com)。他们使用同一软件的稍旧版本:Joomla 1.5.5、PHP5.2.6、mySQL 5.0.4x。他们也使用IIS7,但运行在Windows 32上 我无法在托管站点上使用任何一个SEO设置(我已经在本地机器上使用了SEO设置,配置

我让Joomla 1.5.9在Vista64开发设备的IIS7上运行PHP5.2.8和mySQL 5.1.31。我有两个SEO设置“搜索引擎友好的URL”和“使用Apache mod_重写”工作正常

我还在建立一个托管网站(www.mochahosting.com)。他们使用同一软件的稍旧版本:Joomla 1.5.5、PHP5.2.6、mySQL 5.0.4x。他们也使用IIS7,但运行在Windows 32上

我无法在托管站点上使用任何一个SEO设置(我已经在本地机器上使用了SEO设置,配置基本相同)。让我们从“搜索引擎友好URL”开始,只是为了简单起见

另外,我还没有域名,所以我使用主机文件别名访问该站点。我不希望有人会费尽心机来回答我的问题,所以我只想描述一下这个问题,希望我做得足够好,让人们能够理解到底发生了什么。为了回答这个问题,我将使用joomla主页作为基本URL。是的,这确实意味着Joomla安装在一个子目录中——我不确定这是否是一个问题(在我的开发环境中不是问题)

关于这个问题

打开“搜索引擎友好URL”会导致生成404(“未找到组件”)。在404错误页面中,有一个指向的链接,该链接有效。如果我关闭“搜索引擎友好URL”,那么两者都可以工作。因此,似乎打开“搜索引擎友好URL”会导致的“自动重定向”停止工作

现在,如果我在那里来回导航到各种主菜单链接(我只使用默认的joomla站点,该站点安装了一个新的joomla实例),那么一切正常。它只是去了,那是行不通的。值得注意的是,主菜单中的“主页”链接默认设置为

我已经将主机上phpinfo的输出与我的dev box的输出进行了比较,没有发现任何可能导致此问题的差异

打开第二个SEO设置--“使用Apache mod_rewrite”--并不能解决问题(人们可能会认为它可能会解决问题,因为该设置的目的是在URL中去掉index.php)

“搜索引擎友好的URL”通常看起来很简单——它不需要web.config和重写规则。。。我不确定是什么可能导致它出错


更新-2009-03-03

我认为只打开(“使用Apache mod_rewrite”)中的第一个SEO设置(“搜索引擎友好URL”)可能是个坏主意(尽管我可以在本地机器上自己打开“搜索引擎友好URL”,而且效果很好)。所以我又做了一些实验

我想问题可能是主机上的IIS7没有正确设置URL重写。我做了中描述的(第一个)测试文件,它成功了——这意味着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>


(即,在条件和操作前加上目录名)。那没什么区别。现在,我是一个全新的改写规则的人,所以我可能把事情搞砸了

我想我觉得没有重定向规则有点可疑;也就是说,如果我复制并粘贴一个“重写”的URL,难道不需要告诉服务器这是一个虚构的URL,并且应该重定向到一个真实的URL吗?但是,再一次,在我的本地盒子上,用简单的旧重写规则,这一切都很好,所以我可能找错了方向


谢谢你的帮助

本页最后的步骤将逐步完成

默认情况下,Joomla使用查询字符串 它包含的所有链接URL的参数 为您的网站生成。这 可以通过启用 什么叫“搜索引擎友好型” 在Joomla中的“URL”。但是,这个特性 依赖于URL重写 要在上提供的功能 网络服务器。IIS 6.0没有URL 重写功能,因此您可以 使用第三方URL之一 重写产品,例如 ISAPI_重写或Ionics ISAPI重写 过滤器。IIS 7.0具有URL重写功能 支持,可通过以下方式启用: 安装Microsoft URL重写 IIS 7.0的模块。以下 说明描述了如何重写URL IIS 7.0的模块可用于 在Joomla中启用干净的URL。
首先,您需要下载并安装Microsoft URL重写模块。安装后,创建并打开位于C:\inetpub\wwwroot\Joomla文件夹中的web.config文件。将以下XML代码粘贴到此文件中。


. 登录后,转到站点-->全局配置菜单配置SEO设置,如下所示:
  • 搜索引擎友好URL-是
  • 使用Apache mod_重写-是
  • 为URL添加后缀-否

  • 单击“应用”保存配置,然后浏览到。您将看到,现在Joomla页面中的所有链接都有没有查询字符串参数的URL,如果您单击这些链接中的任何一个,服务器将返回正确的响应:

    问题在于托管公司没有使用FastCGI来运行php。即使它在运行phpinfo()时说“serverapi=CGI/FastCGI”,也可以
    <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>
    
    <?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>