1

我有以下 mod 重写:

RewriteEngine On

# rest api rewrites
RewriteCond %{REQUEST_URI} /api/v [NC]
RewriteRule ^(.*)$ /index.php/$1 [L,QSA]

# main application rewrite
RewriteCond %{DOCUMENT_ROOT}%{REQUEST_FILENAME} !-f
RewriteCond %{DOCUMENT_ROOT}%{REQUEST_FILENAME} !-d
RewriteRule ^/[a-zA-Z0-9\-\_/]+?$ /index.html [L,QSA]

当我将这些放入我的 vhost 配置时,一切正常,但是当我将其放入我的 .htaccess 文件时,第一次重写执行无限循环(日志显示内部重写),第二次重写根本不起作用。

为什么这些重写会在 vhost 而不是我的 .htaccess 文件中?

4

1 回答 1

1
  1. 第一条规则循环是因为您的目标与正则表达式匹配,所以一旦它第一次重写并且规则循环,^(.*)$ matches the URI that you've just rewritten to (/index.php/etc...`),所以它会导致无限循环(或循环与内部重定向限制配置为)。您需要添加一个条件来防止循环:

    # rest api rewrites
    RewriteCond %{REQUEST_URI} !^/index\.php
    RewriteCond %{REQUEST_URI} /api/v [NC]
    RewriteRule ^(.*)$ /index.php/$1 [L,QSA]
    
  2. 第二条规则根本没有被应用,因为在 htaccess 文件中通过规则的 URI 已经去掉了前导斜杠(因为 htaccess 本质上就像<Directory>vhost/server 配置中的一个),所以你至少需要使那个前导斜线可选:

    # main application rewrite
    RewriteCond %{DOCUMENT_ROOT}%{REQUEST_FILENAME} !-f
    RewriteCond %{DOCUMENT_ROOT}%{REQUEST_FILENAME} !-d
    RewriteRule ^/?[a-zA-Z0-9\-\_/]+?$ /index.html [L,QSA]
    
于 2012-10-26T04:24:47.073 回答