【问题标题】:Can 2 .htaccess files block URL rewriting2 .htaccess 文件能否阻止 URL 重写
【发布时间】:2013-05-28 09:02:07
【问题描述】:

我的 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

【问题讨论】:

  • RewriteOptions inherit放在较低级别的.htaccess文件的顶部。
  • 这会导致 500 服务器错误
  • 危险猜测:RewriteRule .* index.php/$0 [PT,L]L 表示:不要处理任何进一步的规则(并且“更深”的 .htaccess 在您文档根目录之前运行)。你能不试试L吗?
  • 我删除了 L - 没有变化
  • @crypticツ RewriteOptions inherit 根据this link 将不起作用,因为规则将放在当前规则之后。因此,来自 codeigniter 的全部捕获将阻止任何进一步的处理

标签: php codeigniter .htaccess mod-rewrite url-rewriting


【解决方案1】:

您的问题在于您正在使用的两个 .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,这是 codeigniter 之一,因此请求有效。

您可以做两件事。首先也是最好的方法是删除您的.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]

【讨论】:

  • 出于几个原因,我认为您的第二个选择是我想要追求的。我删除了 CI .htacess 文件并添加了你的文件,但它现在向我显示了 public_html 的目录
  • 更新了最后一行。可能是您的服务器在最后一个 b1 之前需要一个 /,以防它仍然无法正常工作
  • 我尝试了您的新更新版本,将最后一个重写规则作为 RewriteRule ^(.*)$ b1/index.php/$1 [L] 和 RewriteRule ^(.*)$ /b1/index. php/$1 [L]。在这两种情况下,我只看到 mydomain.com 的目录
  • 我没有解决它,但我认为您为推动这一进程做了最大的努力。谢谢 - 问候 - 比尔
【解决方案2】:

我的尝试:

RewriteEngine on
RewriteBase /

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

RewriteRule ^(.*)$ b1/$1 [L]

【讨论】:

  • 这会将域名 mydomain.com 传递到 mydomain.com/b1 文件夹就好了,但是由 codeigniter Navbar 以 mydomain.com/b1/controller/function 形式生成的请求不会被重写到 mydomain .com/controller/function。我已经替换了 CI .htacess 文件,我应该把它取出来吗?
  • 很奇怪。尝试删除 PT 标志。
  • 什么 PT 标志?上面没看到我也再次替换了 CI .htacess 文件,我应该将其取出,即 1 个 htacess 文件还是 2 个?
  • 我指的是 b1 文件夹中 htaccess 中的 PT 标志。
  • 所以我假设您想保留 CI .htacess 文件 - 我已经这样做了,还取出了 PT 标志,没有变化。 2点附加:1)我刚刚发现我的共享主机提供商使用的是光速服务器,而不是 apache ,尽管他们告诉我它使用相同的 htaccess 术语。 2) 我在 CI htacess 文件中添加了一行乱码 - 请参阅 stackoverflow.com/questions/17046908/…。这不会导致服务器错误,所以也许它没有被访问?
【解决方案3】:

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

Redirect 301 /redirect_from http://www.mydomain.com/redirect_to

【讨论】:

  • mixkorshun,这种方法有正则表达式组件吗?我需要那个
【解决方案4】:

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

【讨论】:

  • Furqan,2 个原因:1) 我读到出于安全原因,最好将您的项目放在 public_html 目录之外,因此我将项目放在外面并将其符号链接到 b1 文件夹。 2)我的主要项目在 b1 中,但我在 public_html 目录中有自己的文件夹的其他添加域
  • 我明白了,那么您必须使用不同的域,在这种情况下,您可以使用指向给定文件夹的主机功能插件域
【解决方案5】:

实现您想要做的最简单的方法是将 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 文件夹中的.htaccess 文件。

【讨论】:

  • 我实际上尝试过这个,但在这种特殊情况下,项目被拼凑在一起,以至于当我将 index.php 文件移动到 public_html 时,许多路径都被破坏了。因此,在这种情况下,最好的解决方案是将项目保持在当前配置中
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-03-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多