IIS does not encode utf-8 urls?

一世执手 提交于 2021-02-08 08:50:08

问题


I'm running Joomla 2.5 on an IIS7 server.

The problem is Joomla's search engine friendly urls don't work. Whatever url I enter, it goes to index.php.

After a painful day of struggling with rewrite rules and IIS settings, I came to two realizations:

  1. Search engine friendly urls are only broken when the urls are unicode.

  2. In my WAMP server, on which the SEF urls work perfectly:

    $_SERVER['REQUEST_URI'] is "mydomain/%D9%85%D8%AD%D8%B5%D9%88%D9%84%D8%A7%D8%AA/%D9%82%D9%84%D8%A8%DB%8C-%D8%B9%D8%B1%D9%88%D9%82%DB%8C"

    But in IIS

    $_SERVER['REQUEST_URI'] is "mydomain/???????/????-?????"

It looks like urls are not URLEncoded.

  • I have enabled unicode aliases, search engine friendly urls, and rewrite in Joomla's global configuration.

  • I have copy/pasted the web.config.txt into my web.config.

Here is my web.config file:

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
  <appSettings />
  <connectionStrings>
     ****
  </connectionStrings>
  <system.web>
    <compilation debug="true" targetFramework="4.0">
      <assemblies>
    <add assembly="System.Web.Extensions.Design, Version=4.0.0.0, Culture=neutral, PublicKeyToken=****" />
    <add assembly="System.Design, Version=4.0.0.0, Culture=neutral, PublicKeyToken=****" />
    <add assembly="System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=****" />
      </assemblies>
    </compilation>
    <customErrors mode="Off" />
    <pages controlRenderingCompatibilityVersion="3.5" clientIDMode="AutoID" />
  </system.web>
    <system.webServer>
        <directoryBrowse enabled="false" />
        <defaultDocument>
            <files>
                <clear />
                <add value="Default.htm" />
                <add value="default.html" />
                <add value="Default.asp" />
                <add value="default.aspx" />
                <add value="default.php" />
                <add value="default.pl" />
                <add value="default.cgi" />
                <add value="index.htm" />
                <add value="index.html" />
                <add value="index.asp" />
                <add value="index.aspx" />
                <add value="index.php" />
                <add value="index.pl" />
                <add value="index.cgi" />
                <add value="iisstart.htm" />
                <add value="_holding.html" />
            </files>
        </defaultDocument>
        <security>
            <requestFiltering>
                <hiddenSegments>
                    <add segment="backup" />
                    <add segment="oldsite" />
                    <add segment="logs" />
                    <add segment="tmp" />
                    <add segment="upload" />
                </hiddenSegments>
            </requestFiltering>
        </security>
        <httpErrors>
            <remove statusCode="404" subStatusCode="-1" />
            <error statusCode="404" prefixLanguageFilePath="" path="/" responseMode="ExecuteURL" />
        </httpErrors>
        <rewrite>
            <rules>
                <clear />
                <rule name="Common Exploit Blocking" stopProcessing="true">
                    <match url="^(.*)$" />
                    <conditions logicalGrouping="MatchAny">
                        <add input="{QUERY_STRING}" pattern="mosConfig_[a-zA-Z_]{1,21}(=|\%3D)" />
                        <add input="{QUERY_STRING}" pattern="base64_encode.*\(.*\)" />
                        <add input="{QUERY_STRING}" pattern="(\&lt;|%3C).*script.*(\>|%3E)" />
                        <add input="{QUERY_STRING}" pattern="GLOBALS(=|\[|\%[0-9A-Z]{0,2})" />
                        <add input="{QUERY_STRING}" pattern="_REQUEST(=|\[|\%[0-9A-Z]{0,2})" />
                    </conditions>
                    <action type="Redirect" url="index.php" appendQueryString="false" redirectType="SeeOther" />
                </rule>
                <rule name="Joomla Search Rule" stopProcessing="true">
                    <match url="(.*)" ignoreCase="true" />
                    <conditions logicalGrouping="MatchAll">
                        <add input="{URL}" pattern="^/search.php" ignoreCase="true" />
                    </conditions>
                    <action type="Rewrite" url="/index.php?option=com_content&amp;view=article&amp;id=4" />
                </rule>
                <rule name="Joomla Main Rewrite Rule" stopProcessing="true">
                    <match url="(.*)" ignoreCase="true" />
                    <conditions logicalGrouping="MatchAll">
                        <add input="{URL}" pattern="(/[^.]*|\.(php|html?|feed|pdf|raw))$" />
                        <add input="{REQUEST_FILENAME}" matchType="IsFile" negate="true" />
                        <add input="{REQUEST_FILENAME}" matchType="IsDirectory" negate="true" />
                    </conditions>
                    <action type="Rewrite" url="index.php/" />
                </rule>
            </rules>
        </rewrite>
        <caching>
            <profiles>
                <add extension=".php" policy="DisableCache" kernelCachePolicy="DisableCache" />
            </profiles>
        </caching>  
    </system.webServer>
</configuration>

回答1:


This is a known bug of IIS7 and there is a hotfix for it, but I am in a hosted environment without privileges to install hotfixes. Here's a link to the Microsoft support website with detailed explanation and the resolution for the issue: FIX: A PHP application that depends on the REQUEST_URI server variable may fail when a request whose URL contains UTF-8 characters is sent to IIS 7.5

But if you can't install the hotfix, here's a workaround to get Joomla's SEF urls work with unicode:

The documentation says php's $_SERVER['REQUEST_URI'] doesn't work with unicode url rewriting, but I figured out that parameters work perfectly. We can send the url as a parameter to the php code and assign it to $_SERVER['REQUEST_URI']

  1. Change your second rewrite rule in web.config file as follows:

    <rule name="Joomla! Rule 2">
        <match url="(.*)" ignoreCase="false" />
        <conditions logicalGrouping="MatchAll" trackAllCaptures="false">
            <add input="{URL}" pattern="^/index.php" negate="true" />
            <add input="{URL}" pattern="/component/|(/[^.]*|\.(php|html?|feed|pdf|vcf|raw))$" />
            <add input="{REQUEST_FILENAME}" matchType="IsFile" negate="true" />
            <add input="{REQUEST_FILENAME}" matchType="IsDirectory" negate="true" />
        </conditions>
        <action type="Rewrite" url="index.php?requesturi={URL}" />
    </rule>
    

    The only change is modifying the url attribute of the <action> tag

  2. In your index.php (located at the root directory of your Joomla site), add this at the top (just after the <?php opening tag)

    $_SERVER['REQUEST_URI'] = $_GET['requesturi'];
    

Done. You have unicode in your beautified urls.



来源:https://stackoverflow.com/questions/25587869/iis-does-not-encode-utf-8-urls

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!