我有一个非常简单的重写规则,但它不起作用。
我有以下内容:
#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/downloads
,id=2
去localhost:8080/downloads/somedownload
,id=5
去localhost:8080/downloads/anotherdownload
,id=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]