mod_rewrite不匹配简单的重定向

时间:2018-02-04 20:11:31

标签: apache .htaccess mod-rewrite

我与m a -> t m a有一个奇怪的问题。我的网站设置方式使用户可以通过return之类的网址访问网页的翻译版本,或只访问正常页面t m,以实现此目的我有以下内容在我的@Pipe({ name: 'sort', }) export class SortPipe implements PipeTransform { transform(array: any[], field: string): any[] { return array.sort((a, b) => a[field].toLowerCase() !== b[field].toLowerCase() ? a[field].toLowerCase() < b[field].toLowerCase() ? -1 : 1 : 0); } }

<Rectangle x:Name="ImageRect" ...>
    <Rectangle.Fill>
        <ImageBrush ImageSource="/Images/close.ico"/>
    </Rectangle.Fill>
</Rectangle>
<Rectangle ...>
    <Rectangle.Style>
        <Style TargetType="Rectangle">
            <Setter Property="Fill" Value="#f9b129"/>
            <Style.Triggers>
                <DataTrigger Binding="{Binding IsMouseOver, ElementName=ImageRect}"
                             Value="True">
                    <Setter Property="Fill" Value="#fbc86A"/>
                </DataTrigger>
            </Style.Triggers>                    
        </Style>
    </Rectangle.Style>
</Rectangle>

在我的开发机器中,我使用Apache 2.4.29运行XAMPP 3.2.2,在我的生产服务器中,我使用Apache 2.4.18运行Ubuntu 16.04.3 LTS。在我的开发机器中,一切正常,如果我尝试访问mod_rewrite它会显示example.com/pt/about,如果我尝试example.com/about它会将页面翻译为葡萄牙语,因为这是正确的行为,但在生产服务器,如果我尝试访问.htaccess我收到404错误,但如果我尝试访问RewriteEngine On RewriteCond %{SCRIPT_FILENAME} !-d RewriteCond %{SCRIPT_FILENAME} !-f RewriteRule ^(en|pt)/?$ index.php?lang=$1 [NC,QSA,L] RewriteRule ^about/?$ about.php [NC,QSA,L] RewriteRule ^contact/?$ contact.php [NC,QSA,L] RewriteRule ^([A-Za-z]{2})/about/?$ about.php?lang=$1 [NC,QSA,L] RewriteRule ^([A-Za-z]{2})/contact/?$ contact.php?lang=$1 [NC,QSA,L] ,它会正确显示页面而不会出现任何问题。

为什么会发生这种情况以及如何纠正呢?

1 个答案:

答案 0 :(得分:1)

来自Apache documentation

  

RewriteBase指令指定用于替换相对路径的每个目录(htaccess)RewriteRule指令的URL前缀。

在每个目录(htaccess)上下文中使用替换中的相对路径时,此指令是必需的,除非满足以下任一条件:

  1. 原始请求和替换位于DocumentRoot下方(而不是通过其他方式,例如Alias可以访问)。
  2. 包含RewriteRule的目录的文件系统路径(后缀为相对替换)也可用作服务器上的URL路径(这种情况很少见)。
  3. 在Apache HTTP Server 2.4.16及更高版本中,当通过Alias或mod_userdir映射请求时,可能会省略此伪指令。
  4. 我认为问题在于配置的差异,它会通过在您的代码中添加RewriteBase /来解决,所以它应该是这样的:

    RewriteEngine On
    RewriteBase /
    RewriteCond %{SCRIPT_FILENAME} !-d
    RewriteCond %{SCRIPT_FILENAME} !-f
    
    RewriteRule ^(en|pt)/?$ index.php?lang=$1 [NC,QSA,L]
    
    RewriteRule ^about/?$ about.php [NC,QSA,L]
    RewriteRule ^contact/?$ contact.php [NC,QSA,L]
    RewriteRule ^([A-Za-z]{2})/about/?$ about.php?lang=$1 [NC,QSA,L]
    RewriteRule ^([A-Za-z]{2})/contact/?$ contact.php?lang=$1 [NC,QSA,L]