-1

我的 public_html 文件夹的 b1 文件夹中有一个 codeigniter 项目:

mydomain.com/b1/controller/function

我想将其更改为:

mydomain.com/controller/function

在浏览器栏中使用 301 重定向。

我的 public_html 中的 .htaccess 文件有:

RewriteEngine on
RewriteRule ^b1/(.*)$ /$1 [R=301,L,NC] 
RewriteRule ^(.*)$ b1/$1

EXPLANATION:

RewriteRule ^b1/(.*)$ /$1 [R=301,L,NC] # THIS IS TO REWRITE ALL REQUESTS FROM THE NAVBAR IN MY PROJECT WHICH HAVE THE FORM mydomain.com/b1/controller/function TO mydomain.com/controller/function. AFTER THIS THE NAVBAR SHOULD SHOW mydomain.com/controller/function ( I ASSUME )

RewriteRule ^(.*)$ b1/$1 # THIS IS TO TAKE ALL INCOMING REQUESTS AND ADD A b1 IN FRONT SO  mydomain.com/controller/function IS REDIRECTED TO  mydomain.com/b1/controller/function - BUT INTERNALLY, SO THAT THE BROWSERS ADDRESS BAR STILL SHOWS A 'PRETTIER'  mydomain.com/controller/function

根据http://htaccess.madewithlove.be/,这应该可行,但我仍然看到:

mydomain.com/b1/controller/function

在我的地址栏中。

请注意,这是一个 codeigniter 项目,CI 有以下 .htaccess 文件。(该项目再次位于我的 public_html/b1 目录中)

RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule .* index.php/$0 [PT,L]

据我所知, mod_rewrite 正在工作,因为 RewriteRule ^(.*)$ b1/$1 在与上面的规则不匹配时工作。

2 .htaccess 文件的某些组合是否会导致地址栏中缺少可见的重写?我想对此进行调试并弄清楚如何实现上面讨论的 URL 格式。

谢谢,

账单

附录:感谢大家的尝试。我注意到多个答案是:

RewriteRule ^b1/(.*)$ /$1 [R=301,L,NC] 
RewriteRule ^(.*)$ b1/$1 [L]

他们似乎有很多L标志。在伪代码中,我想要实现的是:

IF REQUEST is mydomain.com or www.mydomain.com ( with nothing after the /) rewrite to mydomain.com . FIRST REWRITE TO REMOVE B1 IF EXISTS ( this is for the navbar requests which have form: mydomain.com/b1/controller/function which should be rewritten to mydomain.com/controller/function ) so that the address bar shows mydomain.com/controller/function 

如果上面有一个 L ,我认为它不会起作用

Then add b1 back in internally so you redirect to b1 folder where project is stored
4

5 回答 5

2

您的问题在于您正在使用的两个.htaccess文件。使用.htaccess时将使用最接近请求文件夹的文件。在您的情况下,您具有以下文件夹结构

- public_html
  - B1
    - .htaccess  //from codeigniter project
  .htaccess //your own with redirect

因此,当您调用 url 时,它可以找到mydomain.com/b1/controller/function的最接近.htaccess的是 codeigniter 之一,因此它将使用这个。您自己的文件将不会被使用。换句话说,您的重定向规则甚至从未被评估过。

现在,如果您调用mydomain.com/controller/function最接近的.htaccess, 是您自己的,请求mydomain.com/b1/controller/function将按预期重定向到。在那里它将再次尝试找到最接近.htaccess的代码点火器,因此请求有效。

你可以做两件事。首先也是最好的事情是删除您的.htaccess并将文件夹中的所有文件和文件夹b1复制回您的public_html文件夹,然后简单地删除该b1文件夹。这样你的服务器甚至没有b1文件夹,一切都会按预期工作。

第二种选择是合并这两个.htaccess文件并将它们保存在您的public_html文件夹中。确保删除b1文件夹中的那个。该文件看起来像

RewriteEngine on

RewriteRule ^b1/(.*)$ /$1 [R=301,L,NC] 

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ b1/index.php/$1 [L]
于 2013-06-07T07:13:17.030 回答
1

我的尝试:

RewriteEngine on
RewriteBase /

RewriteCond %{ENV:REDIRECT_STATUS} !200
RewriteRule ^b1/(.*)$ /$1 [R=301,L,NC]

RewriteRule ^(.*)$ b1/$1 [L]
于 2013-06-08T18:50:35.603 回答
0

当您希望它作为域中的主项目时,为什么要在 b1 子文件夹中使用它?

于 2013-06-06T16:45:02.187 回答
0

实现您想要做的最简单的方法是将 Codeigniter 的index.php文件移动到您的public_html/文件夹中并更新$system_folder$application_folder路径以指向您的b1/文件夹。下面的例子:

/public_html/index.php

/*
 *---------------------------------------------------------------
 * SYSTEM FOLDER NAME
 *---------------------------------------------------------------
 *
 * This variable must contain the name of your "system" folder.
 * Include the path if the folder is not in the same  directory
 * as this file.
 *
 */
$system_path = 'b1/system';

/*
 *---------------------------------------------------------------
 * APPLICATION FOLDER NAME
 *---------------------------------------------------------------
 *
 * If you want this front controller to use a different "application"
 * folder then the default one you can set its name here. The folder
 * can also be renamed or relocated anywhere on your server.  If
 * you do, use a full server path. For more info please see the user guide:
 * http://codeigniter.com/user_guide/general/managing_apps.html
 *
 * NO TRAILING SLASH!
 *
 */
$application_folder = 'b1/application';

这将“在内部”告诉 Codeigniter 您的所有应用程序内容都在该b1/文件夹中,但从最终用户的角度来看,您的域仍然看起来像mydomain.com/controller/function

您的.htaccess文件将如下所示:

/public_html/.htaccess

RewriteEngine on
RewriteBase /

# redirect any actual requests for your b1 folder
# back to the web root
RewriteRule ^b1/(.*)$ /$1 [R=301,L,NC]

# remove index.php from the url
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php/$1

您应该不需要.htaccess文件b1夹中的文件。

于 2013-06-07T12:47:40.787 回答
0

对于 301重定向,请在 .htaccess 文件中使用Redirect :

Redirect 301 /redirect_from http://www.mydomain.com/redirect_to
于 2013-06-05T20:34:01.063 回答