Преобразование правил перенаправления IIS web.config в Apache .htaccess

Мне пришлось перенести старый сайт PHP с Windows IIS на сервер Linux Apache. Мне нужно преобразовать некоторые правила перенаправления. С некоторыми из них я уже справился, но для некоторых других правил мне не хватает понимания, чтобы заставить их работать.

Существуют исходные правила web.config:

<rule name="Rule1" enabled="true" stopProcessing="true">
    <match url="^switch\.php$" />
    <conditions>
        <add input="{REQUEST_METHOD}" pattern="^POST$" negate="true" />
        <add input="{QUERY_STRING}" pattern="^lang=([^=&amp;]+)$" />
    </conditions>
    <action type="Redirect" url="switch/{C:1}" appendQueryString="false" />
</rule>
<rule name="Rule2" enabled="true" stopProcessing="true">
    <match url="^switch/([^/]+)/?$" />
    <conditions>
        <add input="{REQUEST_FILENAME}" matchType="IsFile" negate="true" />
        <add input="{REQUEST_FILENAME}" matchType="IsDirectory" negate="true" />
    </conditions>
    <action type="Rewrite" url="switch.php?lang={R:1}" />
</rule>
<rule name="Rule3" stopProcessing="true">
    <match url="^zone-client/index\.php$" />
    <conditions>
        <add input="{REQUEST_METHOD}" pattern="^POST$" negate="true" />
    </conditions>
    <action type="Redirect" url="zone-client/index" appendQueryString="false" />
</rule>
<rule name="Rule4" stopProcessing="true">
    <match url="^zone-client/index$" />
    <conditions>
        <add input="{REQUEST_FILENAME}" matchType="IsFile" negate="true" />
        <add input="{REQUEST_FILENAME}" matchType="IsDirectory" negate="true" />
    </conditions>
    <action type="Rewrite" url="zone-client/index.php" />
</rule>
<rule name="Rule5" stopProcessing="true">
    <match url="^index\.php$" />
    <conditions>
        <add input="{REQUEST_METHOD}" pattern="^POST$" negate="true" />
        <add input="{QUERY_STRING}" pattern="^slug=([^=&amp;]+)$" />
    </conditions>
    <action type="Redirect" url="{C:1}" appendQueryString="false" />
</rule>
<rule name="Rule6" stopProcessing="true">
    <match url="^([^/]+)/?$" />
    <conditions>
        <add input="{REQUEST_FILENAME}" matchType="IsFile" negate="true" />
        <add input="{REQUEST_FILENAME}" matchType="IsDirectory" negate="true" />
    </conditions>
    <action type="Rewrite" url="index.php?slug={R:1}" />
</rule>
<rule name="Rule7" stopProcessing="true">
    <match url="^index\.php$" />
    <conditions>
        <add input="{REQUEST_METHOD}" pattern="^POST$" negate="true" />
        <add input="{QUERY_STRING}" pattern="^slug=([^=&amp;]+)&amp;details=([^=&amp;]+)$" />
    </conditions>
    <action type="Redirect" url="{C:1}/{C:2}" appendQueryString="false" />
</rule>
<rule name="Rule8" stopProcessing="true">
    <match url="^([^/]+)/([^/]+)/?$" />
    <conditions>
        <add input="{REQUEST_FILENAME}" matchType="IsFile" negate="true" />
        <add input="{REQUEST_FILENAME}" matchType="IsDirectory" negate="true" />
    </conditions>
    <action type="Rewrite" url="index.php?slug={R:1}&amp;details={R:2}" />
</rule>

И мои попытки преобразовать их:

#Rule1
RewriteCond %{REQUEST_METHOD} !POST
RewriteRule ^translation\.php(.*) /translation? [R=302,L]
#Rule2
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^translation(.*) /translation.php [R=302,L]
#Rule3
RewriteCond %{REQUEST_METHOD} !POST
RewriteCond %{QUERY_STRING} ^lang=&$
RewriteRule ^switch\.php(.*) /switch/%1 [R=302,L,B]
#Rule4
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^zone-client/index(.*) /zone-client/index.php [R=302,L]
#Rule5
RewriteCond %{REQUEST_METHOD} !POST
RewriteCond %{QUERY_STRING} ^slug=&$
RewriteRule ^index\.php(.*) /%1 [R=302,L,B]
#Rule6
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)/?$ /index.php?slug=$1 [R=302,L]
#Rule7
RewriteCond %{REQUEST_METHOD} !POST
RewriteCond %{QUERY_STRING} ^^slug=&;details=&$
RewriteRule ^index\.php(.*) /%1/%2 [R=302,L,B]
#Rule8
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)/(.*)/?$ /index.php?slug=$1&details=$2 [R=302,L]

Пожалуйста, помогите !

0
задан 3 November 2017 в 23:43
1 ответ

Есть пара шагов, которые вы захотите предпринять, чтобы ваши перезаписи поместились в стеке LAMP.

  1. Убедитесь, что Mod_rewrite установлен и включен для веб-сервера.

На сервере на базе Apache 2 запустите:

sudo a2enmod rewrite

Это активирует модуль или предупредит вас, что модуль уже включен. Чтобы эти изменения вступили в силу, перезапустите Apache.

sudo systemctl restart apache2

mod_rewrite теперь полностью включен.

Теперь вы можете настроить файл .htaccess для определения правил перезаписи для перенаправлений.

  1. Убедитесь, что mod_rewrite включен с помощью RewriteEngine On в вашем .htaccess и что он отображается над вашими условиями и правилами. Для получения общей информации о правилах перезаписи в Apache см. Https://httpd.apache.org/docs/2.4/rewrite/remapping.html

В вашем конкретном случае использования (переключение с правил, созданных с помощью IIS URL Rewrite расширение для прямых перезаписей Apache), вы можете проверить некоторые из этих предыдущих сообщений о переполнении стека в качестве примеров:

И если вы хотите дважды проверить / протестировать и отладить свои регулярные выражения, используйте такой инструмент, как https://regex101.com/

  1. . Добавьте свои условия и правила, обязательно укажите необходимые флаги для каждого правила. (Чаще всего при NC не учитывайте регистр). См. Документацию Apache по флагам RewriteRule по адресу https://httpd.apache.org/docs/current/rewrite/flags.html

  2. . Проверьте свои обновленные правила перезаписи .htaccess. Будьте осторожны: одна опечатка в .htaccess может привести к ошибке 500.

0
ответ дан 5 December 2019 в 07:10

Теги

Похожие вопросы