2011-08-24 65 views
1

我现在有这样的.htaccess统治正常工作:htaccess的问题,包括周期/句号

RewriteRule ^instructor/([A-Za-z0-9-]+)$ instructor.php?username=$1 [NC,L] 

然而,当我尝试添加一个时期在网站上混了很多的规则打破所以我假设字符没有正确逃脱:

RewriteRule ^instructor/([A-Za-z0-9-\.]+)$ instructor.php?username=$1 [NC,L] 

任何人指出我在正确的方向吗?

更新

这似乎是什么做的目录结构。

的适用于本网站规则的另一个选择如下:

## Registration 
RewriteRule ^instructor/register/?$ instructor-form/index.php [L] 
RewriteRule ^instructor/register/stage([1-5]+)$ instructor-form/stage$1.php [L] 

这些做工精细的(这里的目录是instructor-form/

然而,也有一个叫instructor/这些规则指向目录到:

RewriteRule ^instructor/dashboard/?$ instructor/index.php [L] 
RewriteRule ^instructor/account-details/?$ instructor/account-details.php [L] 
RewriteRule ^instructor/change-password/?$ instructor/change-password.php [L] 

这些是在添加.时受影响的规则第一条规则。规则都是按顺序进行的,并且在[A-Za-z0-9-] char块中没有.。当添加物理instructor/文件夹似乎无法访问。

回答

1

你在你的问题中写了这么多的文字,但忘了提及重要的细节:什么是真正的破碎?因为我没有明确的答案,因此我会基于迄今为止提供的信息进行猜测。


RewriteRule ^instructor/([A-Za-z0-9-\.]+)$ instructor.php?username=$1 [NC,L] 

这个规则的问题是,它也将改写已经重写PHP文件:instructor/index.phpinstructor/account-details.phpinstructor/change-password.php

我认为你是在中继旗[L]太多..或不知道mod_rewrite和[L]标志是如何工作的。这就是为什么你会遇到这个问题 - 你的模式中的点的规则会重写已经重写的URL。

有用的链接:RewriteRule Last [L] flag not working?


你需要一些条件增加(全局规则或特定条件仅此规则),以防止重写已重写URL或现有文件。

1.全球规则 - 在其他规则之前将其置于顶端的某个位置。请记住,这可能不会如预期取决于您的网站结构工作,重写逻辑(例如,当你需要真正改写请求已存在的文件或文件夹):

# do not do anything for already existing files 
RewriteCond %{REQUEST_FILENAME} -f [OR] 
RewriteCond %{REQUEST_FILENAME} -d 
RewriteRule .+ - [L] 

2。具体条件为仅规则:

一)不重写,如果请求的URI是物理文件

RewriteCond %{REQUEST_FILENAME} !-f 
RewriteRule ^instructor/([A-Za-z0-9-\.]+)$ instructor.php?username=$1 [NC,L] 

OR

B)不重写PHP文件

RewriteCond %{REQUEST_URI} !.+\.php$ 
RewriteRule ^instructor/([A-Za-z0-9-\.]+)$ instructor.php?username=$1 [NC,L] 
+0

谢谢你为你的详细解释,全球规则工作:) – lethalMango