【问题标题】:.htaccess redirects too many times.htaccess 重定向太多次
【发布时间】:2022-01-14 22:29:35
【问题描述】:

我已经为子域编写了一个 .htaccess,但是它重定向了太多次。

我的完整代码如下所示

RewriteEngine On 
RewriteCond %{SERVER_PORT} 80 
RewriteRule ^(.*)$ http://subdomain/$1 [R,L]
    
RewriteEngine On      

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

RewriteRule ^404/?$ /404.php [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-l
RewriteRule ^ http://subdomain/404 [L,R]

【问题讨论】:

  • 你想要什么?
  • 从这个 htaccess 代码中得到这个错误:这个页面不工作 URL 重定向你太多次了。

标签: php regex apache .htaccess mod-rewrite


【解决方案1】:

问题很可能是最顶层的重定向。它实现了一个重定向循环。也不清楚它实际上是什么意思......这里的“子域”是什么?主机名/子域名?所以像http://sub.example.com/$1

假设您由同一个 http 服务器提供服务的所有“子域”,您需要添加一个额外的条件来打破这种外观:

RewriteEngine On 
RewriteCond %{SERVER_PORT} 80 
RewriteCond %{HOST_NAME} !^sub\.example\.com$ 
RewriteRule ^(.*)$ http://sub.example.com/$1 [R,L]

这也可以简化为:

RewriteEngine On 
RewriteCond %{SERVER_PORT} 80 
RewriteCond %{HOST_NAME} !^sub\.example\.com$ 
RewriteRule ^ http://sub.example.com%{REQUEST_URI} [R,L]

也可以考虑使用加密的https协议,这实际上是现在的标准。

【讨论】:

  • 循环没有在子域中中断
  • 请给出一个详细的解释,你想用那个规则重写哪个 URL。目前尚不清楚您实际上要做什么...
【解决方案2】:
RewriteCond %{SERVER_PORT} 80
RewriteRule ^(.*)$ http://subdomain/$1 [R,L]

您实际上并没有说明您要做什么。但是,像这样检查 SERVER_PORT 的端口 80 的唯一原因是,如果您要重定向到 HTTPS(端口 443)。但是您正在重定向到 HTTP(端口 80) - 所以这自然会导致重定向循环。

您需要将 substitution 字符串中的 http 更改为 https。例如:

RewriteCond %{SERVER_PORT} 80
RewriteRule (.*) https://subdomain/$1 [R=301,L]

(最终,这应该是一个 301 永久重定向,一旦您确认它按预期工作。)

或者,如果您不打算强制使用 HTTPS(但您应该这样做),请完全删除这些指令。


RewriteRule ^ http://subdomain/404 [L,R]

并在最后一条规则中更改为https。 (但是,您不应该首先重定向到“404”错误文档。)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-09-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多