我已经阅读了许多类似的请求,例如:
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>
我不认为此规则导致问题,因为它没有被调用,我提供了正确的前缀和协议。
非常感谢,
罗布
答案 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 / *的调用
有人知道为什么这不会进入无限循环吗?