.htacces 重写规则不起作用

.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/downloads和,localhost: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]

我似乎找不到 404 的解决方案。

然而,[r=301]它似乎正确地重定向到页面,但它破坏了重写的目的:使 URL 变得花哨。

答案1

HTTP_REFERER(如果设置)是一个以方案开头的绝对 URL。例如。

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

因此,条件模式诸如^localhost:8080(/|$)永远不会匹配之类的。

还要注意,RewriteCond指令仅适用于后面的单个指令RewriteRule,而不是全部指令,正如您的第一个代码示例所暗示的那样。

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

ARewriteRule 图案例如^/downloads(即以斜杠开头的 URL 路径)永远不会匹配每个目录.htaccess文件。在.htaccess文件中,首先从 URL 路径中删除目录前缀,然后再进行模式匹配。因此,这需要^downloads匹配所有以 开头的 URL /downloads

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 图案,或者要小心放置这些指令的顺序(即最具体的指令放在最前面)。

请尝试以下操作:

# 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]

答案2

我找到了解决问题的方法,

我已将其更改rewrite为:

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]

相关内容