2014-10-18 141 views
0

我试图为我的网站设置自定义重写方案(http://panchr.me)。htaccess - 重写参数路径

这里是我的.htaccess

RewriteEngine on 
ErrorDocument 404 /404.php 

RewriteCond %{REQUEST_URI} !-f 
RewriteCond %{REQUEST_URI} repositories 
RewriteRule ^(.+)repositories(.+) $1repositories?repo=$2 [nocase,last] 

RewriteCond %{REQUEST_FILENAME} !-d 
RewriteCond %{REQUEST_FILENAME}\.php -f 
RewriteRule ^([^\.]+)$ $1.php [nocase,last] 

具体来说,我要重写一些诸如http://panchr.me/repositories/some_namehttp://panchr.me/repositories?repo=some_name。但是,如果我访问此页面,则会出现404错误。此外,刚刚访问http://panchr.me/repositories现在给了我一个500错误。

我该如何解决这个问题?

我的服务器结构如下:

.htaccess 
# a few other files, not available to user 
public_html/ # this is the DocumentRoot 
    index.php 
    repositories.php 
    # more files 

回答

2

你的条件和规则是没有意义的,这应该工作:

RewriteEngine On 
RewriteBase/
ErrorDocument 404 /404.php 

RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteRule ^(repositories)(\.php)?/([^/]+)$ $1.php?repo=$3 [NC,L] 
# alternatively to the above RerwriteRule you could try 
# (comment the above RewriteRule if u do and leave the conditions uncommented) 
#RewriteRule ^(repositories)(?:\.php|)/([^/]+)$ $1.php?repo=$3 [NC,L] 

RewriteCond %{REQUEST_FILENAME} !-d 
RewriteCond %{REQUEST_FILENAME}\.php -f 
RewriteRule ^([^\.]+)$ $1.php [NC,L] 

它几乎说,如果文件或文件夹不存在2条件:

RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} !-d 

然后RewriteRule说,重定向anyt hing即repositories/anything,例如:

http://panchr.me/repositories/moduleA 
http://panchr.me/repositories/other 
http://panchr.me/repositories/some_name 
+0

是否可以(可选)匹配'repositories.php/some_name'?我试图将RewriteRule作为'RewriteRule ^([^ \。] +)(repositories)(?:\。php)?/([^ /] +)$ $ 1 $ 2.php?repo = $ 3 [NC,L]' ,但这并不能作为一个论据。 (我不得不使用'([^ \。] +)',因为我不能设置RewriteBase而不会搞乱另一个规则)。 – 2014-10-19 02:26:00

+0

@RushyPanchal那么'储存库'究竟在哪里?也许如果你告诉我更多关于你的结构,我可以给你一个更好的答案。 '([^ \。] +)'匹配任何不是点的,你期望匹配什么,会出现在'repositories'之前? **如果存在其他规则,使用'RewriteBase'弄乱了底层规则,将文件夹重定向到它们各自的'php' ** – Prix 2014-10-19 02:40:59

+0

我更新了我的原始问题与服务器结构。基本上,'.htaccess'位于'repositories.php'的_parent目录中。我的答案是“(?:\。php)?',它应该是'.php'的可选匹配项。我想重写能够做到这一点: 'panchr.me/repositories/test' - >'panchr.me/repositories.php?repo = test'(这个工程已经) 'panchr.me/repositories。 php/test' - >'panchr.me/repositories.php?repo = test'(这不起作用)。 – 2014-10-19 02:52:21