.htacces重写规则不起作用

我有一个非常简单的重写规则,但它不工作。

我有以下几点:

#old see edits for newer versions RewriteCond %{HTTP_REFERER} ^localhost:8080(/|$) RewriteRule ^/downloads/.* /somePackage/index.php?id=5 [NC,C] RewriteRule ^/downloads /somePackage/index.php?id=2 [NC,L] 

它似乎没有通过RewriteCond ,为什么是这样呢?

当我尝试这个:

 RewriteRule downloads/? /somePackage/index.php?id=2 [NC,L] 

它似乎工作localhost:8080/downloads

但是当我尝试:

 RewriteRule downloads/.*/? /somePackage/index.php?id=5 [NC,L] 

它不起作用,为什么这不起作用? 我应该怎么做呢?

编辑:

我这是目前的代码,只适用于localhost:8080/downloadslocalhost:8080/downloads/但不是当我添加一些东西后斜线

 RewriteRule downloads/somedownload/? /somePackage/index.php?id=5 [NC,L] RewriteRule downloads/? /somePackage/index.php?id=2 [NC,L] 

编辑2:

这里是使用的.htaccess代码。

 # Only the URLs /downloads and /downloads/ (with and without trailing slash) RewriteRule ^downloads/?$ /somePackage/index.php?id=2 [NC,L] #gives 404 - Category not found RewriteRule ^downloads/ignis_desktop$ /somePackage/index.php?id=5 [NC,L] # Everything else that starts /downloads/<something> RewriteRule ^downloads/. /somePackage/index.php?id=5 [NC,L] 

我似乎无法find404的解决scheme。

然而, [r=301]似乎正确地redirect到页面,但它打破了重写的目的:使url幻想。

HTTP_REFERER (如果设置)是以scheme开始的绝对URL。 例如。

 http://localhost:8080/.... 

所以,一个CondPattern^localhost:8080(/|$)永远不会匹配。

还要注意, RewriteCond指令只适用于下面的单个RewriteRule ,而不是所有的,因为你的第一个代码示例似乎暗示。

 RewriteRule ^/downloads /somePackage/index.php?id=2 [NC,L] 

RewriteRule 模式 (如^/downloads (即以斜线开头的URLpath))在每个目录.htaccess文件中都不会匹配。 在.htaccess文件中,目录前缀在模式匹配之前首先从URLpath中移除。 所以,这需要^downloads以匹配所有以/downloads开头的url。

 RewriteRule downloads/.*/? /somePackage/index.php?id=5 [NC,L] 

由于该模式需要结尾斜杠,因此不会与localhost:8080/downloads匹配。

更新:

我想localhost:8080/downloadsid=2localhost:8080/downloads/somedownloadid=5localhost:8080/downloads/anotherdownloadid=6然而,我已经压缩它的问题/downloads/<everything-else>转到id=5

我假设/downloads 不是文件系统上的物理目录。 在这种情况下,您应该在RewriteRule 模式上使用string锚点( $ )的结尾,或者小心放置这些指令的顺序(即最具体的第一个)。

尝试以下操作:

 # Only the URLs /downloads and /downloads/ (with and without trailing slash) RewriteRule ^downloads/?$ /somePackage/index.php?id=2 [NC,L] # Everything else that starts /downloads/<something> RewriteRule ^downloads/. /somePackage/index.php?id=5 [NC,L] 

你是否应该捕捉/downloads/downloads/ – 理想情况下,它应该是一个或另一个是有争议的。

要捕获特定的URL(例如/downloads/somedownload ),那么这将需要在“其他…”规则之前:

 RewriteRule ^downloads/somedownload$ /somePackage/index.php?id=5 [NC,L] 

我已经find了解决我的问题,

我已经改变了这个:

 RewriteRule ^downloads/somedownload$ /somepackage/index.php?option=com_content&view=article&id=5 

虽然在我的菜单中,我可以参考这样的网页:

 localhost:8080/home 

它会重写它:

 RewriteRule ^home/? /somepackage/index.php?id=1 [L,NC]