Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 当给定太多参数时,重写规则触发器404_Php_Regex_Apache_.htaccess_Mod Rewrite - Fatal编程技术网

Php 当给定太多参数时,重写规则触发器404

Php 当给定太多参数时,重写规则触发器404,php,regex,apache,.htaccess,mod-rewrite,Php,Regex,Apache,.htaccess,Mod Rewrite,我目前正在建设的网站由两个主要部分组成:公众可以访问的一方和只有授权人员才能访问的管理方 它是用基本模板构建的,这样不同的部分可以按如下方式访问(使用重写规则) 公众: http://localhost/about应重写为http://localhost/index.php?page=about 管理员: http://localhost/admin/manage-users应重写为http://localhost/admin/index.php?page=manage-用户 所有URL只有一个

我目前正在建设的网站由两个主要部分组成:公众可以访问的一方和只有授权人员才能访问的管理方

它是用基本模板构建的,这样不同的部分可以按如下方式访问(使用重写规则)

公众:
http://localhost/about
应重写为
http://localhost/index.php?page=about

管理员:
http://localhost/admin/manage-users
应重写为
http://localhost/admin/index.php?page=manage-用户

所有URL只有一个参数。也就是说,public将始终是localhost/PAGE,admin将始终是localhost/admin/PAGE

目前,我有以下
.htaccess
文件:

RewriteEngine on

RewriteRule ^admin/([^/.]+)/?$ /admin/index.php?page=$1 [L,NC]

RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ index.php?page=$1 [L,NC]
当您正确构造URL时,这似乎可以正常工作。例如,如果我导航到
localhost/about
localhost/admin/manageusers
两个页面都正确加载。但是如果我转到
localhost/about/blah
localhost/admin/manage users/blah
,页面会加载,但是CSS不存在。查看Chrome中的开发者工具,这似乎是因为它试图分别从
localhost/about/CSS/
localhost/admin/CSS/
目录加载CSS文件,因为样式表链接到具有相对路径的页面。(实际上,
localhost/css/
是它实际所在的目录。)

因此,即使RedirectRule忽略URL中的任何额外参数,它也会尝试加载URL中提供的最后一个“目录”的相对路径

有没有办法完全忽略任何额外的
。/..
参数?或者,更好的是,在提供太多参数时触发404

更新:我刚刚发现这个问题实际上比我之前想象的要复杂得多。因为我的页面只有虚拟数据来测试模板文件,所以直到现在我才注意到它


当您导航到
localhost/admin
localhost/admin/manage users
http://localhost/admin/index.php
文件,但当您导航到
localhost/admin/manage users/blah时,
将恢复加载
http://localhost/index.php
文件。这让我觉得重写规则中有一些我需要更改的地方,尽管我不知道是什么。

您需要将所有链接设置为绝对URL(例如
href=“/css/style.css”
),或者将相对URL基添加到页面标题:

<base href="/" />

从长远来看,最好在css、js、图像文件中使用绝对路径,而不是相对路径。这意味着您必须确保这些文件的路径以
http://
或斜杠
/
开头

但为了避免大量更改网站,您可以使用以下规则修复css/js/images链接:

RewriteEngine on

# fix CSS/js/images links
RewriteRule (?:^|/)((?:css|js|images)/.+)$ /$1 [L,R=301]

RewriteRule ^admin/([^.]+)/?$ /admin/index.php?page=$1 [L,NC,QSA]

RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.+)$ /index.php?page=$1 [L,QSA]

不要忘了用实际的css/js/images目录替换第一条规则。

只需将css设置为相对于文档根目录的,所以从
/
开始。这肯定会解决问题,但是,如果这是在一个css文件中发生的,那么它将在整个站点的每个链接中发生。而且有很多链接。这是否适用于所有链接?无论是CSS/JS链接还是超链接?我意识到情况比我想象的更糟。见上面的更新。谢谢:)那可能行得通,不过我意识到情况比我想象的更糟。见上面的更新。谢谢:)好的,现在检查更新的答案,以获得完整且正确的答案。htaccess。谢谢,这几乎是完美的。唯一的问题是,现在如果您导航到
http://localhost/admin/manage-users/blah
它将尝试加载
http://localhost/admin/index.php?page=manage-用户/blah
。显然,我可以很容易地在模板中的“/”上爆炸,以获得实际的页面名称,所以最坏的情况下,我会这样做。但是有没有一种方法可以抓取htaccess文件中的第一部分呢?事实上,现在我想起来了,最好还是保持原样,如果页面不存在,就从索引文件中抛出404。谢谢你的帮助!