如何停止htaccess重写规则更新浏览器URL

时间:2015-07-17 15:03:19

标签: apache .htaccess mod-rewrite

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

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

但是我无法弄清楚我做错了什么,任何帮助都会非常感激。

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

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

我已经建立了一条基本路线,所有这些都与Codeigniter E.g一起工作正常。如果我导航到:

/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

我的问题是,如何停止更新浏览器网址?

更新 - 作为https终点的AWS ELB后面的我的Web服务器站点。我在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>

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

非常感谢,

罗布

2 个答案:

答案 0 :(得分:0)

检查index.php是否设置了$config['index_page']

如果将其更改为:

$config['index_page'] = '';

答案 1 :(得分:0)

好的,经过大量测试后,似乎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&#34; http&#34;

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 / *的调用

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