Передача несуществующего каталога в качестве параметра в IIS или Apache - PullRequest
1 голос
/ 22 августа 2009

Первый взгляд на этот URL:

https://stackoverflow.com/questions/tagged/xoxoxo/

Этот каталог не существует, но каким-то образом stackoverflow может передать этот последний каталог в качестве параметра своему базовому сценарию.

Можно ли настроить IIS или Apache для этого? Как?

1 Ответ

5 голосов
/ 22 августа 2009

Механизм такого поведения называется переписывание URL и может быть реализован в Apache с модулями mod_rewrite и в IIS с либо Helicons ISAPI_Rewrite Lite (или одна из несвободных альтернатив, предлагаемых Helicon) для IIS 5.1 и 6 или с Модуль перезаписи URL-адреса Microsoft для IIS 7 .

Например, следующие настройки гарантируют, что каждый запрос, который не может быть сопоставлен с существующим файлом или каталогом, будет передан в файл index.php.

mod_rewrite (.htaccess в корневом каталоге вашего документа или где-то в вашем httpd.conf)

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} -s [OR] // IF is file (with size > 0)
RewriteCond %{REQUEST_FILENAME} -l [OR] // OR is symbolic link
RewriteCond %{REQUEST_FILENAME} -d      // OR is directory  
RewriteRule ^.*$ - [NC,L]               // DO NOTHING
RewriteRule ^.*$ index.php [NC,L]       // TRANSFER TO index.php

ISAPI_Rewrite Lite (в соответствующем диалоге настроек IIS)

// uses same syntax as mod_rewrite
RewriteEngine on
RewriteCond %{REQUEST_FILENAME} -s [OR]
RewriteCond %{REQUEST_FILENAME} -l [OR]
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule ^.*$ - [NC,L]
RewriteRule ^.*$ index.php [NC,L]

Модуль перезаписи URL-адресов Microsoft (в вашем web.config в корневом каталоге документа или в другом месте дерева конфигурации)

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <system.webServer>
        <rewrite>
            <rules>
                <clear />
                <rule name="MatchExistingFiles" stopProcessing="true">
                    <match url="^.*$" />
                    <conditions logicalGrouping="MatchAny">
                        <add input="{REQUEST_FILENAME}" matchType="IsFile" pattern="" ignoreCase="false" />
                        <add input="{REQUEST_FILENAME}" matchType="IsDirectory" pattern="" ignoreCase="false" />
                    </conditions>
                    <action type="None" />
                </rule>
                <rule name="RemapMVC" stopProcessing="true">
                    <match url="^.*$" />
                    <conditions logicalGrouping="MatchAll" />
                    <action type="Rewrite" url="index.php" />
                </rule>
            </rules>
        </rewrite>
    </system.webServer>
</configuration>
...