【问题标题】:.htaccess parse url works on localhost but gets redirect loop on VPS host.htaccess 解析 url 在本地主机上工作,但在 VPS 主机上获得重定向循环
【发布时间】:2014-06-07 00:12:30
【问题描述】:

我正在尝试使用 .htaccess 解析 url 并拉取我们的 1 或 2 个参数以根据 url 加载内容。

如果只有第一个 url 参数 (site.com/param1) 存在,那很好,应该路由到 index.php?c=param 但也可以是 (site.com/param1/param2) 并路由到索引.php?c=param1&p=param2

它在 Mavericks 上运行的 MAMP PRO 上完美运行,但是当我将 repo 克隆到我们的 VPS 上时,我得到了一个重定向循环。该站点有一个管理区域,因此我需要忽略遵循该模式的任何 url

site.com/admin

“可解析”网址遵循这种模式

site.com/param1

site.com/param1/param2

.htaccess 看起来像这样:

<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /

## SEO REWRITES ###
RewriteRule ^(admin) - [L]
RewriteRule ^/?([a-zA-Z0-9_]+)/?$ /index.php?page=$1
RewriteRule ^/?([a-zA-Z0-9_]+)/([0-9]+)/?$ /index.php?page=$1&e=$2

## URL PARSE ##

RewriteRule ^([^/]+)$  /index.php?c=$1
RewriteRule ^([^/]+)/([^/]+)$  /index.php?c=$1&p=$2
</IfModule>

我迷路了,但我觉得我在这里错过了一些简单的东西。最令人困惑的部分是它从开发开始就一直有效。任何人都知道为什么在带有 apache 的 vps 上而不是在 localhost 上运行时重定向循环的原因,或者更重要的是如何在实时服务器上解析它。

我现在使用这个方法,除非 url 中缺少尾部斜杠,然后它会中断,我尝试了 dif 变体以使其匹配而没有尾部斜杠,但我只是得到 404 或内部服务器错误:

<IfModule mod_rewrite.c>

重写引擎开启 重写基础/

RewriteRule ^(admin) - [L]
RewriteRule ^/?([a-zA-Z0-9_]+)/?$ /index.php?page=$1
RewriteRule ^/?([a-zA-Z0-9_]+)/([0-9]+)/?$ /index.php?page=$1&e=$2


RewriteCond  %{REQUEST_FILENAME} !-f
RewriteCond  %{REQUEST_FILENAME} !-d

RewriteRule ^/?([^/]+)/([^/]+)$  /index.php?c=$1&p=$2 [L,QSA]
RewriteRule ^/?([^/]+)/$  /index.php?c=$1&p=index [L,QSA]


</IfModule>

【问题讨论】:

    标签: apache .htaccess mod-rewrite redirect


    【解决方案1】:

    这样吧:

    <IfModule mod_rewrite.c>
    RewriteEngine On
    RewriteBase /
    
    RewriteCond %{REQUEST_FILENAME} -d [OR]
    RewriteCond %{REQUEST_FILENAME} -f
    RewriteRule ^ - [L]
    
    ## SEO REWRITES ###
    RewriteRule ^(admin) - [L]
    
    RewriteRule ^/?(\w+)/([0-9]+)/?$ /index.php?page=$1&e=$2 [L,QSA]
    
    RewriteRule ^/?(\w+)/?$ /index.php?page=$1 [L,QSA]
    
    ## URL PARSE ##
    
    RewriteRule ^([^/]+)/([^/]+)/?$  /index.php?c=$1&p=$2 [L,QSA]
    
    RewriteRule ^([^/]+)/?$  /index.php?c=$1 [L,QSA]
    
    </IfModule>
    

    【讨论】:

    • 我仍然在实时服务器上得到一个重定向循环。我完全不知道为什么,所有的部分都到位并且看起来正确。它也可以在 localhost 上完美运行。
    • 仅基于此评论很难提供解释/答案。哪个 URL 导致循环?实时服务器的 DocumentRoot 值是多少?这个 .htaccess 的位置是什么?
    • 我把它上传到了一个 DIF 服务器,它工作正常。将此答案标记为正确,因为问题似乎与服务器配置相关。
    • 我已经更新了我的问题以反映新问题,这似乎很小。
    • 添加 RewriteRule ^([a-zA-Z0-9_-]+)$ /index.php?c=$1&p=index [L,QSA] 作为最后一条规则,它可以工作。感谢您提供的所有帮助,我衷心感谢。
    【解决方案2】:

    问题是

    RewriteRule ^([^/]+)$  /index.php?c=$1
    

    匹配

    index.php?c=blah
    

    您需要添加一个规则,以便提供任何有效路径而不需要修改。

    尝试添加

    RewriteCond %{REQUEST_FILENAME} !-f
    

    就在RewriteEngine on之后

    【讨论】:

      猜你喜欢
      • 2017-02-08
      • 1970-01-01
      • 2019-08-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-06-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多