【问题标题】:AH00124: Request exceeded the limit of 10 internal redirects due to probable configuration errorAH00124:由于可能的配置错误,请求超出了 10 个内部重定向的限制
【发布时间】:2020-05-05 15:38:58
【问题描述】:

当有人访问我网站上的商店页面时,我一直在我的 apache 日志中看到此错误,我尝试删除我的 htaccess 并使用 .php?s=$var 但我仍然收到相同的错误,所以我认为这是与 apache 配置文件有关,与 htaccess 文件无关,无论如何都在这里

htaccess:

RewriteEngine on
RewriteCond %{HTTPS} !on [OR]
RewriteCond %{HTTP_HOST} !^www\.
RewriteRule (.*) https://www.example.com%{REQUEST_URI} [L,R=301]

RewriteCond %{THE_REQUEST} //
RewriteRule ^(.*)$ /$1 [L,R=301]

RewriteRule ^home/?$ home.php  [NC]

RewriteCond %{THE_REQUEST} /shop\?c=([^&\s]+)&s=([^&\s]+)&s2=([^&\s]+)&b=([^&\s]+) [NC]
RewriteRule ^ shop/%1/%2/%3/%4? [L,R=302,NE]

RewriteRule ^shop/([^/]+)/([^/]+)/([^/]+)/([^/]+)/?$ shop.php?c=$1&s=$2&s2=$3&b=$4 [L,QSA,B]
RewriteRule ^shop/([^/]+)/([^/]+)/([^/]+)/?$ shop.php?c=$1&s=$2&s2=$3 [L,QSA,B]
RewriteRule ^shop/([^/]+)/([^/]+)/?$ shop.php?c=$1&s=$2 [L,QSA,B]

RewriteCond %{REQUEST_FILENAME} !-d 
RewriteCond %{REQUEST_FILENAME}\.php -f 
RewriteRule ^(.*)$ $1.php [L]

SSL Apache 配置:

<IfModule mod_ssl.c>
<VirtualHost *:443>
    ServerAdmin admin@example.com
    ServerName example.com
    ServerAlias www.example.com
    DocumentRoot /var/www/example.com/public_html
    ErrorLog ${APACHE_LOG_DIR}/error.log
    CustomLog ${APACHE_LOG_DIR}/access.log combined

Include /etc/letsencrypt/options-ssl-apache.conf
SSLCertificateFile /etc/letsencrypt/live/example.com/fullchain.pem
SSLCertificateKeyFile /etc/letsencrypt/live/example.com/privkey.pem
</VirtualHost>
</IfModule>

HTTP Apache 配置:

<VirtualHost *:80>
    ServerAdmin admin@example.com
    ServerName example.com
    ServerAlias www.example.com
    DocumentRoot /var/www/example.com/public_html
    ErrorLog ${APACHE_LOG_DIR}/error.log
    CustomLog ${APACHE_LOG_DIR}/access.log combined

    <Directory "/var/www/example.com">
        AuthType Basic
        AuthName "Restricted Content"
        AuthUserFile /etc/apache2/.htpasswd
        Require valid-user
    </Directory>

RewriteEngine on
RewriteCond %{SERVER_NAME} =example.com [OR]
RewriteCond %{SERVER_NAME} =www.example.com
RewriteRule ^ https://www.example.com%{REQUEST_URI} [END,NE,R=permanent]
</VirtualHost>

【问题讨论】:

  • 触发重写循环的请求 URL 是什么?您应该在服务器配置中启用 mod_rewrite 调试(例如LogLevel rewrite:trace3 或类似的)以从重写循环中获取回溯 - 这将为实际发生的事情提供一个重要线索。

标签: .htaccess redirect apache2


【解决方案1】:

您发布的服务器配置文件中没有任何内容会导致重写循环 - 您的服务器配置中没有次重写。

我已尝试删除我的 htaccess 并使用 .php?s=$var,但仍然遇到相同的错误

这令人费解。您在子目录中还有其他.htaccess 文件吗?如果没有任何 .htaccess 文件和您发布的服务器配置,似乎不可能获得重写循环 - 因为您根本没有重写!

但是,附加 .php 扩展名的最后一个规则块在某些情况下可能会导致重写循环。这需要纠正。您目前拥有:

RewriteCond %{REQUEST_FILENAME} !-d 
RewriteCond %{REQUEST_FILENAME}\.php -f 
RewriteRule ^(.*)$ $1.php [L]

问题在于,检查&lt;filename&gt;.php 是否存在的第二个条件不一定执行以下RewriteRule 将重写的相同文件检查。例如。请求/foo/bar,其中存在/foo.php,将导致重写循环。

要解决此问题,您需要将第二个条件更改为类似以下内容:

RewriteCond %{DOCUMENT_ROOT}%{REQUEST_URI}.php -f

请参阅my answer 到以下 ServerFault 问题,该问题更详细地解释了这一点:

所以,完整的规则变成:

RewriteCond %{REQUEST_FILENAME} !-d 
RewriteCond %{DOCUMENT_ROOT}%{REQUEST_URI}.php -f
RewriteRule ^(.*)$ $1.php [L]

您还应该确保 MultiViews 已禁用(如果尚未禁用),因为您的 URL 直接映射到没有 .php 文件扩展名的文件(否则 mod_negotiation 将重写 URL - 在 mod_rewrite 之前 - 您将丢失 URL 参数) .在您的 .htaccess 文件的顶部包括:

Options -MultiViews

【讨论】:

    猜你喜欢
    • 2018-08-21
    • 2012-05-03
    • 2010-12-09
    • 1970-01-01
    • 2017-06-01
    相关资源
    最近更新 更多