2017-07-26 162 views
1

我在PHP中关于重定向的一些问题,我用的.htaccess这个,但没有成功 我有什么htaccess的是以下2个网址:重定向通过在PHP

http://localhost/PROJECT_NAME/USERNAME/348 

http://localhost/PROJECT_NAME/USERNAME 

什么我想在这里是:

1)如果请求从

http://localhost/PROJECT_NAME/USERNAME/111 

然后来到它应该去:

http://localhost/PROJECT_NAME/index.php 

2)如果请求从

http://localhost/PROJECT_NAME/USERNAME 

来到那么就应该去:

http://localhost/PROJECT_NAME/detail.php 

我试了一下:

RewriteRule /(\w+)$ detail.php?id=$1 [L] 
RewriteRule /(\w+)$ index.php [L] 
RewriteRule /$ detail.php?id=$1 [L] 
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_URI} !index.php 
RewriteCond %{REQUEST_URI} !(.*)/$ 

没有成功在此之后CEED它工作得很好指数而不是详细信息页面,请提前

Randheer

回答

0

你这里有几个问题帮助谢谢你们的时间。首先是匹配的顺序和特异性。

首先,一个很大的疑难杂症的正则表达式学习者:\w(简写“字”字类)相当于[A-Za-z0-9_]。 。 。请注意包含的数字和下划线!

假设所有在最后一个片段的ID是只有数字和用户名是字母,数字小的都有些混,和/或下划线,你可以改变匹配的顺序和使用\d(数字)字符类第一:

RewriteRule /(\d+)$ index.php [L] 
RewriteRule /(\w+)$ detail.php?id=$1 [L] 

这应该涵盖你的两个例子。

您没有列出第三条规则的用例,因此我不确定您要将哪些网址应用于或将如何更改。这里有一些观察,但:

  1. 你应该把RewriteCond线它们适用于RewriteRule之前。 (请注意,重写规则的表达式实际上是先检查,然后是条件。)
  2. 现在,RewriteRule表达式将匹配任何以不是真实文件的尾部斜线结尾的内容。
  3. 还检查它不是index.php对于!-f是多余的。并且由于您使用的是尾部斜线,因此您可能实际上需要检查它不是目录(与文件相对)使用!-d
  4. RewriteCond表达式试图在否定表达式内捕获(因此它永远不会捕获任何东西,或比赛以来的有效表达,物质是一样的一个在规则,/$

如果你想允许上的用户名一个斜线上面,你可以只添加到什么是已经there:

RewriteRule /(\d+)$ index.php [L] 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteRule /(\w+)/?$ detail.php?id=$1 [L] 

如果第三条规则的用例有所不同,或者这些RewriteCond表达式针对的是不同于您所粘贴的规则的其他规则,请随时根据详细信息编辑问题,并且我可以更新我的答案以解决该问题。

+0

非常感谢您的回复。 我想上面的选项,但它没有工作 的主要问题是与以下网址: 的http://本地主机/ PROJECT_NAME/USERNAME 它不重定向到“detail.php” –

+0

页@RandheerSinghChouhan数事情:1.其他规则是否正常工作?如果没有,那么'RewriteEngine On'出现在这些行之前? 2.您尝试了以上哪个版本的代码? 3.这个.htaccess文件位于哪个路径?另外,浏览器内部不应该发生重定向 - 这些规则的目的是*重写*将请求文件指向Apache的请求(对用户透明)。如果您想要发出客户端重定向(例如响应代码301或302),则需要相应地使用“[R]”或“[R = 301]”标志。 – justbeez