繁体   English   中英

htaccess用于目录结构的重写器

[英]htaccess rewriterule for directory structure

我有以下.htaccess重写问题。 我们有带有多个子目录和一个.html文件的输入请求,例如dir1/file.htmldir1/dir2/file.htmldir1/dir2/dir3/file.htmldir1/dir2/dir3/dir4/file.html

我们最终需要的是一个重写规则

index.html?dir1=$1&dir2=$2&dir3=$3&dir4=$4&file=$5

(如果路径太短,则dir2dir5将为空)

有什么方法可以直接在.htaccess文件中执行此操作,还是需要在php中进行处理?

我将看看是否可以对此进行测试,但这应该可以解决该问题,因为您的问题表明了这一点:

RewriteRule     ^/([a-z0-9]+)/?([^/]*)$       /index.php?dir1=$1&$2 [QSA]
RewriteRule     ^/([a-z0-9]+)/([a-z0-9]+)/([a-z0-9]+)/([a-z0-9]+)/?$    /index.php?dir1=$1&dir2=$2&dir3=$3&dir4=$4 [L]
RewriteRule     ^/([a-z0-9]+)/([a-z0-9]+)/([a-z0-9]+)/?$    /index.php?dir1=$1&dir2=$2&dir3=$3 [L]
RewriteRule     ^/([a-z0-9]+)/([a-z0-9]+)/?$    /index.php?dir1=$1&dir2=$2 [L]
RewriteRule     ^/([a-z0-9]+)/?$    /index.php?dir1=$1 [L]

强调应该是因为只有您才能真正说出您的网站结构以及此级联规则集将如何影响您的应用程序。

使用的正则表达式非常简单:

([a-z0-9]+)

它将捕获任何包含字母和字符的目录名称。 如果要捕获(比如说),在其上加下划线和下划线,它将变为:

([a-z0-9_-]+)

我设置的第一个重写规则^/([a-z0-9]+)/?([^/]*)$ -是捕获dir1之后的所有内容,以防万一要捕获的数据不是严格的目录结构。 您可以根据需要将其注释掉。 刚刚添加了它,因为这就是我喜欢处理需要URL解析的情况的方式。

另外,您是否考虑过将其添加到重写规则中? 也许在规则层叠之前就位于顶部?

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d

我建议你这个

http://domain/dir1-dir2-dir3-dir4-dir5-file.html

规则

RewriteEngine On
RewriteBase /
RewriteRule (.+)-(.+) $1/$2 [N]

您甚至可以通过添加这些来使其动态

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php?q=$1

这要干净得多。

更新:

好吧,我并不是说您使用了第二部分,但是无论如何我都解释了我的意思,人们使用QUERY STRING在URL中传递路径并没有错,但重要的是您如何在URL中进行操作

http://domain/index.php?route=dir1/dir2/dir3/dir4/dir5/file.html

如您所见,您只需使用一个GET变量即可轻松抓住路径,甚至在RewriteRule中对此进行处理也变得更加容易,例如

RewriteEngine On
RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php?route=$1&%{QUERY_STRING} [L]

这将使您拥有这样的网址

http://domain/dir1/dir2/dir3/.../file.html

并且出于任何原因,您都可以将这些斜杠更改为连字符或其他可接受的字符,如下所示

http://domain/dir1-dir2-dir3-dir4-dir5-dir6-dir7-file.html

正如我所说的,传递当前的QUERY_STRING看起来更容易

http://domain/dir1-dir2-file.html?q=extra_query_value

如果您转储$ _GET,则会导致PHP为:

q => 'extra_query_value'
route => 'dir1/dir2/file.html'

最后,在PHP中,您可以轻松地将它们炸开,使每个文件夹的名称都具有单独的变量。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM