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。谢谢你的帮助!