.htaccess : Pretty URL 参数的数量+名称
.htaccess : Pretty URL with whatever number+names of parameters
你好 !
我知道已经有很多关于 URL 重写的话题,我发誓我已经花了很多时间尝试将它们应用到我的问题上,但我看不到它们中的任何一个能完美地应用到我的情况中(如果您发现其他情况,请给出 link)。
-----
这是问题所在:
我正在学习 MVC 模型和 URL 重写,我的 URL 是这样的:
http://localhost/blahblahblah/mywebsite/index.php?param1=value1¶m2=value2¶m3=value3 ... etc ...
我想要的(对于某些 MVC 模板目标)是具有这种 URL :
http://localhost/blahblahblah/mywebsite/value1/value2/value3 ... etc ...
-----
Whatever 是参数的名称,whatever 是值。
这是我找不到解决方案的最重要的事情。
(也不要介意 localhost blahblahblah,即使在遥远的网站上也能正常工作,但我相信它在在线网站上也能正常工作,URL 的这一部分可能对我想要的不重要去做)
非常感谢您抽出时间帮助我更清楚地了解我需要做什么。
如果 .htaccess
文件位于文档根目录中(即有效地位于 http://localhost/.htaccess
),那么您需要使用 mod_rewrite:[=36 执行类似以下操作=]
RewriteEngine On
RewriteRule ^(blahblahblah/mywebsite)/(\w+)$ /index.php?param1= [L]
RewriteRule ^(blahblahblah/mywebsite)/(\w+)/(\w+)$ /index.php?param1=¶m2= [L]
RewriteRule ^(blahblahblah/mywebsite)/(\w+)/(\w+)/(\w+)$ /index.php?param1=¶m2=¶m3= [L]
# etc.
其中 $n
是对前面 RewriteRule
pattern(第一个参数)中相应捕获组的反向引用。
UDPATE: \w
是一个 shorthand 字符 class 匹配 a-z
, A-Z
, 0-9
和 _
(下划线)。
每个参数数量都需要一个新指令。您可以将它们组合成一个(复杂的)指令,但是当只传递几个参数(而不是根本不传递这些参数)时,您会有很多 empty 参数。
我假设您的 URL 没有以斜杠结尾。
但是,如果 .htaccess
文件位于 /blahblahblah/mywebsite
目录中,那么可以稍微简化指令:
RewriteRule ^(\w+)$ index.php?param1= [L]
RewriteRule ^(\w+)/(\w+)$ index.php?param1=¶m2= [L]
RewriteRule ^(\w+)/([\w]+)/([\w]+)$ index.php?param1=¶m2=¶m3= [L]
# etc.
不要使用 URL 参数(替代方法)
另一种方法是不将路径段转换为 .htaccess
中的 URL 参数,而是将所有内容传递给 index.php
并让您的 PHP 脚本拆分URL 进入参数。这允许任意数量的参数。
例如,您的 .htaccess
文件会变得更加简单:
RewriteRule ^\w+(/\w+)*$ index.php [L]
(这里假设.htaccess
文件位于/blahblahblah/mywebsite
目录下,否则需要像上面那样添加必要的目录前缀。)
RewriteRule
模式简单地验证请求URL是/value1
或/value1/value2
或[=32的形式=] 等。请求被重写为 index.php
(前端控制器)来处理所有事情。
然后在 index.php
中检查 $_SERVER['REQUEST_URI']
并解析请求的 URL.
你好 !
我知道已经有很多关于 URL 重写的话题,我发誓我已经花了很多时间尝试将它们应用到我的问题上,但我看不到它们中的任何一个能完美地应用到我的情况中(如果您发现其他情况,请给出 link)。
-----
这是问题所在:
我正在学习 MVC 模型和 URL 重写,我的 URL 是这样的:
http://localhost/blahblahblah/mywebsite/index.php?param1=value1¶m2=value2¶m3=value3 ... etc ...
我想要的(对于某些 MVC 模板目标)是具有这种 URL :
http://localhost/blahblahblah/mywebsite/value1/value2/value3 ... etc ...
-----
Whatever 是参数的名称,whatever 是值。
这是我找不到解决方案的最重要的事情。
(也不要介意 localhost blahblahblah,即使在遥远的网站上也能正常工作,但我相信它在在线网站上也能正常工作,URL 的这一部分可能对我想要的不重要去做)
非常感谢您抽出时间帮助我更清楚地了解我需要做什么。
如果 .htaccess
文件位于文档根目录中(即有效地位于 http://localhost/.htaccess
),那么您需要使用 mod_rewrite:[=36 执行类似以下操作=]
RewriteEngine On
RewriteRule ^(blahblahblah/mywebsite)/(\w+)$ /index.php?param1= [L]
RewriteRule ^(blahblahblah/mywebsite)/(\w+)/(\w+)$ /index.php?param1=¶m2= [L]
RewriteRule ^(blahblahblah/mywebsite)/(\w+)/(\w+)/(\w+)$ /index.php?param1=¶m2=¶m3= [L]
# etc.
其中 $n
是对前面 RewriteRule
pattern(第一个参数)中相应捕获组的反向引用。
UDPATE: \w
是一个 shorthand 字符 class 匹配 a-z
, A-Z
, 0-9
和 _
(下划线)。
每个参数数量都需要一个新指令。您可以将它们组合成一个(复杂的)指令,但是当只传递几个参数(而不是根本不传递这些参数)时,您会有很多 empty 参数。
我假设您的 URL 没有以斜杠结尾。
但是,如果 .htaccess
文件位于 /blahblahblah/mywebsite
目录中,那么可以稍微简化指令:
RewriteRule ^(\w+)$ index.php?param1= [L]
RewriteRule ^(\w+)/(\w+)$ index.php?param1=¶m2= [L]
RewriteRule ^(\w+)/([\w]+)/([\w]+)$ index.php?param1=¶m2=¶m3= [L]
# etc.
不要使用 URL 参数(替代方法)
另一种方法是不将路径段转换为 .htaccess
中的 URL 参数,而是将所有内容传递给 index.php
并让您的 PHP 脚本拆分URL 进入参数。这允许任意数量的参数。
例如,您的 .htaccess
文件会变得更加简单:
RewriteRule ^\w+(/\w+)*$ index.php [L]
(这里假设.htaccess
文件位于/blahblahblah/mywebsite
目录下,否则需要像上面那样添加必要的目录前缀。)
RewriteRule
模式简单地验证请求URL是/value1
或/value1/value2
或[=32的形式=] 等。请求被重写为 index.php
(前端控制器)来处理所有事情。
然后在 index.php
中检查 $_SERVER['REQUEST_URI']
并解析请求的 URL.