【问题标题】:Attempting an advanced htaccess rewrite trick, having difficulties尝试高级 htaccess 重写技巧,遇到困难
【发布时间】:2023-03-18 15:17:01
【问题描述】:
大家好,这是我正在尝试的:
我想这样做,以便我可以将所有 url 变量和值转换为文件夹,所有这些都使用一个规则。我期待找到一些方法来做到这一点:
www.example.com/var1/val1/var2/val2/varN/valN
在理想的世界里,我可以改写成这样:
www.example.com/index.php?var1=val1&var2=val2&varN=valN
但我也很乐意做这样的事情:
www.example.com/index.php?path=/var1/val1/var2/val2/varN/valN
然后在 PHP 中将它们加工成数组或结构。在我的情况下,一切都通过 index.php 工作,所以这是一个常数。
有没有办法做到这一点?我无法通过谷歌找到任何东西,显然我自己也想不通!
谢谢大家 :-)
【问题讨论】:
标签:
url
.htaccess
mod-rewrite
variables
【解决方案1】:
这是从我的主要 apache 配置中的 <Directory> 指令中几乎逐字复制的内容。我一直无法这样做,但也应该在.htaccess 中工作(可能没有<Directory> 部分)。
<Directory /path/to/document/root/>
RewriteEngine On
RewriteRule ^(.*)$ index.php?path=$1 [QSA]
</Directory>
网址http://www.any.com/foo/bar/baz/spam/eggs 应变为http://www.any.com/index.php?path=/foo/bar/baz/spam/eggs
【解决方案2】:
试试这个规则:
RewriteEngine on
RewriteRule !^index\.php$ index.php?path=%{REQUEST_URI} [L]
这会将除index.php 之外的所有请求重写为index.php。
如果您想排除现有文件和目录,请将这些 RewriteCond 指令添加到您的规则中:
RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule !^index\.php$ index.php?path=%{REQUEST_URI} [L]
这是前一种格式的规则,只是参数的格式为var[]:
RewriteRule ^([^/]+)/([^/]+)(.*)$ /$3?$1[]=$2 [N,QSA]
【解决方案3】:
Gumbo,我真的很喜欢这个解决方案,效果很好:
重写规则 ^([^/]+)/([^/]+)(.*)$ /$3?$1[]=$2 [N,QSA]
我觉得我需要在其中粘贴 !(js|css) 之类的东西来排除这些文件夹,但我不知道在哪里,我尝试了几个地方都无济于事。你对此有什么调整吗?再次感谢您的杀手级解决方案!
编辑:我想通了,或者说找到了!
我把它放在重写规则之前:
RewriteCond %{REQUEST_FILENAME} !^(.+).css$
RewriteCond %{REQUEST_FILENAME} !^(.+).js$
最后,它看起来像这样,并且完美运行:
RewriteCond %{REQUEST_FILENAME} !^(.+).css$
RewriteCond %{REQUEST_FILENAME} !^(.+).js$
重写规则 ^([^/]+)/([^/]+)(.*)$ /$3?$1[]=$2 [N,QSA]
这个解决方案我最喜欢的方面是我可以传递 url 数组,所以:
www.any.com/var1/val1/var1/val2/
实际创造
$var1= 数组("val1","val2");