我有以下结构
-www
\-subfolder
Run Code Online (Sandbox Code Playgroud)
在www我有我的主要网站index.php.
在子文件夹中我有一种管理UI,在那里我想index.php为管理员界面提供另一个.
目前我的内部请求/subfolder/index.php被重定向到www/index.php我的管理界面UI的页面并没有显示出来.
这是我的.htaccess档案:
RewriteEngine On
RewriteRule ^$ index.php [QSA,L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)/(.*)$ index.php?lang=$1&page=$2 [L]
Run Code Online (Sandbox Code Playgroud)
你能帮助我吗?我在其他答案中尝试了几个选项,但由于我不是一个非常先进的Web开发人员,我无法工作.
@TerryE,对不起,如果我是粗暴的.
我正在使用本地设置进行测试.我已经安装了Vertrigo服务器,它给了我Apache server.Running在Windows7操作系统上.服务器安装在Program files\VertrigoServ\Apache文件夹中.
我的公共文件夹是www.在那里,我有我的主要网站定义..该网站通过127.0.0.1/index.php或本地访问127.0.0.1/
我有网站本地化,所以URL构建为/$lang/$page 例如<a href=" / <?php echo $lang; ?> / home "> HOME </a>
在index.php主站点我有以下内容:
$page = trim( ( isset( $_GET[ 'page' ] ) ? $_GET[ 'page' ] : 'home' ), '/' );
$lang = trim( ( isset( $_GET[ 'lang' ] ) ? $_GET[ 'lang' ] : 'en' ), '/' );
$langs = array( 'en', 'fr', 'ru' );
Run Code Online (Sandbox Code Playgroud)
根据这些数据,我可以这样打开页面:
include 'html/'. $lang . '/' . $page . '.php';
Run Code Online (Sandbox Code Playgroud)
我所有主要网站的页面都在 www/html/$lang/
$_SERVER['REQUEST_URI'])给出/en/home页面HOME.
127.0.0.1/en/home 作品
但是我创建了一个管理UI,它位于www/admin文件夹中 - 位于www下面的一个级别.
在那里我没有任何本地化.我只是把EN作为语言.所以在admin文件夹的index.php顶部我再次拥有
$page = trim( ( isset( $_GET[ 'page' ] ) ? $_GET[ 'page' ] : 'home' ), '/' );
Run Code Online (Sandbox Code Playgroud)
但是,这里的导航如下 <a href=/admin/home"> HOME </a>
然后,我将在admin文件夹中的index.php中构建页面,如下所示:
include 'html/ . $page . '.php';
Run Code Online (Sandbox Code Playgroud)
页面在于 www/admin/html
这根本不起作用.每当我在管理界面中按主页链接时,我都会被重定向到我的主站点(非现有页面).如果我加入RewriteRule ^subfolder/ - [L].htaccess,我明白了HTTP 404 NOT Found error.
127.0.0.1/admin/home什么都不行.在管理员中也没有任何其他导航.感谢您愿意和耐心帮助我!
我假设你在www目录中只有一个.htaccess文件.
想想这个规则
RewriteRule ^(.*)/(.*)$ index.php?lang=$1&page=$2 [L]
Run Code Online (Sandbox Code Playgroud)
当从Perdir上下文中解释时从www:获取表单的任何URI someDir/somePage并替换它index.php?lang=someDir&page=somePage,因此这将拦截并重写任何/subfolder/index.php.
这没有详细记录,但Perdir处理将优先使用请求路径上的最低.htaccess文件设置RewriteEngine On.因此,如果您在"子文件夹"子文件夹中添加一个特定于管理员的.htaccess文件,这将抢占www一并解决此问题.
当真正的问题是"如果我的网站是由共享服务托管我如何调试我的.htaccess规则"之一时,Veni和其他海报会进入问答环节.我添加共享服务限定的原因是,如果您具有对LAMP配置的root访问权限,那么您可以启用重写日志记录,并且调试级别为4-6的日志文件将为您提供足够的取证来计算正在进行的操作.
但是,大多数业余爱好/小型服务用户在共享的基础上购买他们的服务,在这里他们没有root访问权限,托管服务提供商出于性能原因禁用此类日志记录,因此他们有二进制反馈 - 规则有效或者他们有别.我使用共享服务,我的方法(这里描述)是设置一个VM,它反映了这个配置作为测试和集成环境 - 在这里我有这样的root访问权限.但是,对于大多数用户来说,这可能太复杂了.这实际上是一个更广泛的主题,值得自己的Q /讨论.
具体点:
如果您的结构是/(lang|admin)/page,那么为什么你有这个规则,因为它可能会对perdir重试造成严重破坏.
RewriteRule ^$ index.php [QSA,L]
Run Code Online (Sandbox Code Playgroud)更好的类似下面的内容强制重定向到默认语言(假设在这个示例中,lang列表是EN和IT:
RewriteCond %{ENV:REDIRECT_STATUS} ^$
RewriteCond $1 !^/(en|it|admin)/
RewriteRule ^(.*) http://yourdomain/en/$1 [R=301,L]
Run Code Online (Sandbox Code Playgroud)您是否了解重定向重启/循环问题?(搜索REDIRECT_STATUS)
我是Stackoverflow的新手,但不是为了解决这种问题.我在我的博客上有一些详细的文章.
好一些一般的帮助.
如果您有一个小诊断存根来帮助您了解正在发生的事情,这也有帮助,这就是我在测试目录中为index.php提出的:
<?php header( "Content-type: text.plain" ); echo "main: "; var_export($_GET);
Run Code Online (Sandbox Code Playgroud)但是你确实需要以下每种情况: - 处理URI存在(并停止重写循环) - /和/ admin/ - admin/* - */* - *(和语言默认值)的默认值
这就是我想出来的.我保持简单.我们可以使用复杂的regexp来折叠其中一些,但为什么要这么麻烦.如果需要,您可能需要添加更多QSA.
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} -f [OR]
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule . - [L]
RewriteRule ^$ index.php [QSA,L]
RewriteRule ^admin/?$ admin/index.php [QSA,L]
RewriteRule ^admin/(.*)$ admin/index.php?page=$1 [L]
RewriteRule ^(.*)/(.*)$ index.php?lang=$1&page=$2 [L]
RewriteRule ^(.*)$ index.php?lang=en&page=$1 [L]
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
38052 次 |
| 最近记录: |