【问题标题】:web.config to mod_rewrite returning 400 Bad Requestweb.config 到 mod_rewrite 返回 400 Bad Request
【发布时间】:2014-07-17 08:23:07
【问题描述】:

第一次在这里使用 mod_rewrite 我有这个规则在 IIS 上工作:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
    <system.webServer>
        <rewrite>
            <rules>
                <rule name="services" stopProcessing="true">
                    <match url="^([a-z]+)/service/([a-zA-Z-]+)" />
                    <action type="Rewrite" url="serveis.php?id={R:2}&amp;lang={R:1}"/>
                </rule>
                <rule name="categories" stopProcessing="true">
                    <match url="^([a-z]+)/category/([a-zA-Z-]+)" />
                    <action type="Rewrite" url="subhome.php?id={R:2}&amp;lang={R:1}"/>
                </rule>
                <rule name="index_idioma" stopProcessing="true">
                    <match url="^([a-z]+)/index" />
                    <action type="Rewrite" url="index.php?lang={R:1}"/>
                </rule>
                 <rule name="index" stopProcessing="true">
                    <match url="http://www.domain.com" />
                    <action type="Rewrite" url="http://www.domain.com/index.php?lang=en"/>
                </rule>
                  <rule name="kinds" stopProcessing="true">
                    <match url="^([a-z]+)/kind" />
                    <action type="Rewrite" url="tipusserveis.php?lang={R:1}"/>
                </rule>
                <rule name="company" stopProcessing="true">
                    <match url="^([a-z]+)/our_company" />
                    <action type="Rewrite" url="/empresa.php?lang={R:1}" />
                </rule>
                 <rule name="contact" stopProcessing="true">
                    <match url="^([a-z]+)/contact" />
                    <action type="Rewrite" url="/contacto.php?lang={R:1}" />
                </rule>
            </rules>
        </rewrite>
    </system.webServer>
</configuration>

现在我想使用 apache 的 mod_rewrite 来实现,我试过这个:

<IfModule mod_rewrite.c>
    RewriteEngine On
    RewriteRule ^/([a-z]+) index.php?lang=$1 [NC,L]
    RewriteRule ^/([a-z]+)/our_company/?$ empresa.php?lang=$1 [NC,L]
    RewriteRule ^/([a-z]+)/contact/?$ contacto.php?lang=$1 [NC,L]
    RewriteRule ^/([a-z]+)/service/([A-Za-z0-9-]+)/?$ serveis.php?id=$2&lang=$1 [NC,L]
    RewriteRule ^/([a-z]+)/category/([A-Za-z0-9-]+)/?$ subhome.php?id=$2&lang=$1 [NC,L]
    RewriteRule ^/([a-z]+)/kind/([A-Za-z0-9-]+)/?$ tipusserveis.php?id=$2&lang=$1 [NC,L]
</IfModule>

但它们都不起作用。

有人可以在这里帮助我吗,至少给我一些关于我应该怎么做的方向?

编辑: Plesk Panel 自动将此添加到httpd.conf

<IfModule mod_rewrite.c>
    RewriteEngine On
    RewriteCond %{HTTP_HOST} ^www.domain.com$ [NC]
    RewriteRule ^(.*)$ http://domain.com$1 [L,R=301]
<IfModule>

我猜它会从 URL 中删除 www,但我不知道它是否也会停止应用其他规则。 谢谢

【问题讨论】:

    标签: apache .htaccess mod-rewrite iis web-config


    【解决方案1】:

    由于您的 URI 模式中缺少锚点 ^$,您在 mod_rewrite 中遇到错误。在您的根 .htaccess 或 Apache 配置中尝试这些规则:

    <IfModule mod_rewrite.c>
        RewriteEngine On
    
        RewriteCond %{REQUEST_FILENAME} -d [OR]
        RewriteCond %{REQUEST_FILENAME} -f
        RewriteRule ^ - [L]
    
        RewriteRule ^/?([a-z]+)/?$ index.php?lang=$1 [NC,L,QSA]
        RewriteRule ^/?([a-z]+)/our_company/?$ empresa.php?lang=$1 [NC,L,QSA]
        RewriteRule ^/?([a-z]+)/contact/?$ contacto.php?lang=$1 [NC,L,QSA]
        RewriteRule ^/?([a-z]+)/service/([a-z0-9-]+)/?$ serveis.php?id=$2&lang=$1 [NC,L,QSA]
        RewriteRule ^/?([a-z]+)/category/([a-z0-9-]+)/?$ subhome.php?id=$2&lang=$1 [NC,L,QSA]
        RewriteRule ^/?([a-z]+)/kind/([a-z0-9-]+)/?$ tipusserveis.php?id=$2&lang=$1 [NC,L,QSA]
    </IfModule>
    

    【讨论】:

    • 这些规则也不起作用,我仍然收到400 Bad Request404 Not Found
    • 这个 .htaccess 在哪里?您的 .htaccess 中是否有更多规则,或者这些是唯一的规则?还告诉我你为哪个 URL 设置了 400 和 404?
    • 我正在使用 Parallels Plesk Panel,但我不知道为什么 .htaccess 文件被忽略,所以我在 apache 配置文件中编写规则。
    • 他们都返回 400,有一个返回 404,但我错过了重写规则。
    • 为了测试目的,在您的DocumentRoot 中创建一个 .htaccess 并将这些规则放在那里。否则每次更改规则时都需要重新启动 Apache。
    【解决方案2】:

    1) 您的替换(第二个参数)不能是相对路径。它需要以 / 开头或重定向,而不仅仅是例如“索引.php”。这是您 400 的直接原因——您的错误日志可能清楚地显示了一个不以 / 开头的 URL 路径(这是无效的)

    2) 您应该忽略将这些规则放在 .htaccess 中的建议。这使得 mod_rewrite 的维护更加复杂。

    【讨论】:

      猜你喜欢
      • 2011-08-31
      • 2020-11-01
      • 1970-01-01
      • 2013-01-29
      • 2017-11-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多