【问题标题】:How to stop htaccess rewrite rule updating browser URL如何停止更新浏览器 URL 的 htaccess 重写规则
【发布时间】:2015-07-17 15:03:18
【问题描述】:

我已经阅读了许多类似的请求,例如:

Apache rewrite rule - prevent rewritten URL appearing in browser URL bar

但我无法弄清楚我做错了什么,任何帮助将不胜感激。

我正在使用 codeigniter 3,它的根位于以下位置:

https://example.com/api/v1.0

我已经设置了一条基本路线,并且使用 Codeigniter 一切正常,例如如果我导航到:

/api/v1.0/index.php/pages/view/about

出现适当的页面,因此所有接缝都很好。我真正想要的是重写 URL,以便在我输入时:

/api/v1.0/pages/view/about

它转到同一页面。我添加了一个重写规则的 htaccess 文件,一切都按预期工作:

Options +FollowSymlinks
RewriteEngine on
RewriteBase /api/v1.0/
RewriteCond $1 !^(index.php|resources|robots.txt)
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php/$1 [L,QSA]

问题是,当我输入网址时:

/api/v1.0/pages/view/about

它转到正确的页面,但浏览器 URL 更新为:

/api/v1.0/index.php/pages/view/about

我的问题是,如何阻止浏览器 URL 的更新?

更新 - 我的 Web 服务器站点位于充当 https 端点的 AWS ELB 后面。我在 httpd.conf 中有以下内容,以确保任何非“www”前缀的 URL 和任何 http 调用都被重定向到 https://www

<VirtualHost *:80>
    RequestHeader set X-Forwarded-Proto "http"

    RewriteEngine On
    RewriteCond %{HTTP:X-Forwarded-Proto} !https
    RewriteCond %{REQUEST_URI} !^/_hostmanager/
    RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} [R,L]

    RewriteCond %{HTTP_HOST} !^www\.  [NC]
    RewriteCond %{HTTP_HOST} !^test\. [NC]
    RewriteCond %{HTTP_HOST} !^signup\. [NC]
    RewriteCond %{REQUEST_URI} !^/_hostmanager/
    RewriteRule ^(.*)$ https://www.%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
</VirtualHost>

我认为此规则不会导致问题,因为它没有被调用,我提供了正确的前缀和协议。

非常感谢,

罗伯

【问题讨论】:

    标签: apache .htaccess mod-rewrite


    【解决方案1】:

    检查index.php 未设置为$config['index_page']

    如果是改成:

    $config['index_page'] = '';
    

    【讨论】:

    • 感谢建议,设置如下:$config['index_page'] = '';
    【解决方案2】:

    好的,经过大量测试,我的 httpd.conf 中的虚拟主机设置似乎导致了问题。如果我删除了这些规则,然后本地 .htaccess 规则完全按预期工作。

    我已删除本地 .htaccess 规则并将以下规则添加到 httpd.conf:

    RewriteRule    ^/api/v1\.0/([A-Za-z0-9-/]+)/?$    /api/v1.0/index\.php/$1    [NC,L,QSA]    # Process API Call
    

    我的虚拟主机部分现在如下所示:

    RequestHeader 设置 X-Forwarded-Proto "http"

    RewriteEngine On
    RewriteCond %{HTTP:X-Forwarded-Proto} !https
    RewriteCond %{REQUEST_URI} !^/_hostmanager/
    RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} [R,L]
    
    RewriteCond %{HTTP_HOST} !^www\.  [NC]
    RewriteCond %{HTTP_HOST} !^test\. [NC]
    RewriteCond %{HTTP_HOST} !^signup\. [NC]
    RewriteCond %{REQUEST_URI} !^/_hostmanager/
    RewriteRule ^(.*)$ https://www.%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
    RewriteRule    ^/api/v1\.0/([A-Za-z0-9-/]+)/?$    /api/v1.0/index\.php/$1    [NC,L,QSA]    # Process API Call
    

    所以现在调用:

    /api/v1.0/some/directory
    

    将被重写为:

    /api/v1.0/index.php/some/directory
    

    这不会重定向浏览器或影响浏览器 URL。我不明白的是为什么这没有进入无限循环,因为我没有重写前提条件来检查对 /api/v1.0/index.php/* 的调用

    有人知道为什么这不是进入无限循环吗?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-12-06
      • 2016-11-19
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多