将 IIS web.config 重定向规则转换为 Apache .htaccess

将 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]

请帮忙!

答案1

有一个在线转换器,它将 web.config 文件作为输入并输出相应的 htaccess 重写规则。

https://www.megacolorboy.com/posts/convert-iis-webconfig-to-apache-htaccess-using-javascript/

我曾多次在简单的 web.config 文件中使用它,效果非常好!

答案2

您需要采取几个步骤才能在 LAMP 堆栈上完成重写。

  1. 确保已安装 Mod_rewrite 并已为 Web 服务器启用。

在基于 Apache 2 的服务器上,运行:

sudo a2enmod rewrite

这将激活模块或提醒您模块已启用。要使这些更改生效,请重新启动 Apache。

sudo systemctl restart apache2

mod_rewrite 现已完全启用。

现在您可以设置一个.htaccess 文件来定义重定向的重写规则。

  1. 确保RewriteEngine On在您的 .htaccess 中启用了 mod_rewrite,并且它出现在您的条件和规则之上。 有关 Apache 中重写规则的一般信息,请参阅 https://httpd.apache.org/docs/2.4/rewrite/remapping.html

在您的特定用例中(从使用 IIS URL Rewrite 扩展生成的规则切换到直接 Apache 重写),您可能需要查看 Stack Overflow 上的一些先前帖子作为示例:

如果你想要仔细检查/测试和调试你的正则表达式,使用 https://regex101.com/ 之类的工具

  1. 添加您的条件和规则,确保在每个规则上标明必要的标志。(最常见的是,使用 NC 不区分大小写)。 请参阅 Apache 的 RewriteRule 标志文档:https://httpd.apache.org/docs/current/rewrite/flags.html

  2. 测试更新后的 .htaccess 重写规则。请小心 - .htaccess 中的一个拼写错误可能会导致 500 错误。

相关内容