.htaccess 如何使用apache重写实现这一点?(如果url不包含2个字符串中的1个,请更改url)

.htaccess 如何使用apache重写实现这一点?(如果url不包含2个字符串中的1个,请更改url),.htaccess,codeigniter,mod-rewrite,.htaccess,Codeigniter,Mod Rewrite,我安装了一个包含重写规则的.htaccess文件(如CodeIgniter所建议的),如下所示 我如何添加到它中,以便将任何不以members/或admin/开头的URL请求置于开头 i、 e.如果有人请求联系,它实际上应该转到public/contact等等,除非他们请求members/something或admin/something .htaccess当前访问: RewriteBase / # Removes access to the system folder by users. R

我安装了一个包含重写规则的.htaccess文件(如CodeIgniter所建议的),如下所示

我如何添加到它中,以便将任何不以
members/
admin/
开头的URL请求置于开头

i、 e.如果有人请求联系,它实际上应该转到
public/contact
等等,除非他们请求
members/something
admin/something


.htaccess当前访问:

RewriteBase /

# Removes access to the system folder by users.
RewriteCond %{REQUEST_URI} ^_system.*
RewriteRule ^(.*)$ /index.php?/$1 [L]

# prevent user access to the application folder
RewriteCond %{REQUEST_URI} ^myapp.*
RewriteRule ^(.*)$ /index.php?/$1 [L]

# This snippet re-routes everything through index.php, unless
# it's being sent to resources, or searching for robots.text
# Add any OR's in here if you need other directly accessable Files/folders 
RewriteCond $1 !^(index\.php|resources|robots\.txt)
RewriteRule ^(.*)$ index.php/$1  


.htaccess-已编辑-这就是它现在的样子:

RewriteCond %{REQUEST_URI} ^_system.*
RewriteRule ^(.*)$ /index.php?/$1

RewriteCond %{REQUEST_URI} ^myapp.*
RewriteRule ^(.*)$ /index.php?/$1 

RewriteCond $1 !^(index\.php|resources|robots\.txt)
RewriteRule ^(.*)$ index.php/$1      

RewriteCond %{REQUEST_URI} !^/(members/|admin/|public/|index\.php) [NC]
RewriteRule ^(.*)$ /public/$1 [L]    
目前所有请求都返回404。我肯定我出了什么问题,但不知道是什么:)

文件结构为:

site_root/.htaccess site_root/index.php
site\u root/myapp/

您可以在regex前面加上
表示“不得匹配”。因此,您可以通过以下方式实现您想要的:

RewriteCond %{REQUEST_URI} !^(public|members|admin)/ [NC]
RewriteRule ^(.*)$ /public/$1 [L]
注意:我添加了一个新答案,因为它与我的旧答案基本无关,并且是基于对你文章的编辑。留下我的旧答案供参考

这里有许多问题,但有一个大问题需要解决,才能解决这些小问题。看起来您使用的框架是通过index.php(它肯定有自己的内部路由器到myapp/中的应用程序控制器)路由一切(除了少数例外)。但您也表示希望通过public/路由所有内容(除了例外)

这些是相互排斥的可能性——你不能同时在两个地方安排所有的交通。因此,我可以着手修改上述规则并显示代码,但前提是我知道这些规则应该做什么。考虑到您在介绍文本中所说的内容,再加上.htaccess中已有的内容,您甚至不可能知道这些组合规则应该做什么。只有在您回答以下问题后,我才能使用代码详细信息编辑此帖子:

  • 您使用的是什么框架
  • 什么是公共的/应该是什么?它是一个目录(如果是,它应该保存什么)?还是应该路由到应用程序并由应用程序处理的内容
  • 您当前的管理员和成员部分是否通过转到管理员/和成员/子目录来工作?或者这些是路由到应用程序并由应用程序处理的
  • 关于应用程序的结构,您还有其他重要的细节吗

您还应该在您的病情中添加
public
,否则您可能会遇到
/public/public/contact
等。谢谢各位,我在“不得匹配”标准中添加了“public”。然而,当我尝试mysite.com/contact/now:@gio 1)时,我似乎遇到了这个错误。你把这个新规则放在哪里了(用新的细节更新你的问题)2)在你当前.htaccess上的最后一个重写规则中添加
[L]
标志(我的意思是:
重写规则^(.*)$index.php/$1[L]
)3)你的
index.php
在哪里?您可能还需要将其作为排除项添加到此规则中(就像您对public所做的那样)。