我必须将一个旧的 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=([^=&]+)$" />
</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=([^=&]+)$" />
</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=([^=&]+)&details=([^=&]+)$" />
</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}&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 堆栈上完成重写。
- 确保已安装 Mod_rewrite 并已为 Web 服务器启用。
在基于 Apache 2 的服务器上,运行:
sudo a2enmod rewrite
这将激活模块或提醒您模块已启用。要使这些更改生效,请重新启动 Apache。
sudo systemctl restart apache2
mod_rewrite 现已完全启用。
现在您可以设置一个.htaccess 文件来定义重定向的重写规则。
- 确保
RewriteEngine On
在您的 .htaccess 中启用了 mod_rewrite,并且它出现在您的条件和规则之上。 有关 Apache 中重写规则的一般信息,请参阅 https://httpd.apache.org/docs/2.4/rewrite/remapping.html
在您的特定用例中(从使用 IIS URL Rewrite 扩展生成的规则切换到直接 Apache 重写),您可能需要查看 Stack Overflow 上的一些先前帖子作为示例:
- https://stackoverflow.com/questions/9591938/convert-web-config-file-to-htaccess
- https://stackoverflow.com/questions/3936015/convert-iis-rules-to-apache-htaccess-rewrite
如果你想要仔细检查/测试和调试你的正则表达式,使用 https://regex101.com/ 之类的工具
添加您的条件和规则,确保在每个规则上标明必要的标志。(最常见的是,使用 NC 不区分大小写)。 请参阅 Apache 的 RewriteRule 标志文档:https://httpd.apache.org/docs/current/rewrite/flags.html
测试更新后的 .htaccess 重写规则。请小心 - .htaccess 中的一个拼写错误可能会导致 500 错误。