htaccess rewriterule用于目录结构

时间:2014-01-07 03:22:03

标签: php apache .htaccess

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

我们最终需要的是

的重写规则
index.html?dir1=$1&dir2=$2&dir3=$3&dir4=$4&file=$5

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

有没有办法直接在.htaccess文件中执行此操作,还是需要在php中处理它?<​​/ p>

2 个答案:

答案 0 :(得分:2)

我会看看我是否可以测试一下,但是这个为问题工作,因为你的问题说明了:

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]

强调应该因为只有你能真正说明你的网站结构是什么&amp;这个级联规则集将如何影响您的应用程序。

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

([a-z0-9]+)

用字母&amp ;;捕获任何目录名称字符。如果你想捕捉 - 让我们说 - 下划线和破折号,它会改变为:

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

我设置的第一个重写规则 - ^/([a-z0-9]+)/?([^/]*)$ - 用于捕获dir1之后的任何内容,以防万一要捕获的数据不是严格的目录结构。如果您愿意,可以对此进行评论。刚添加它,因为我喜欢这样处理需要URL解析的情况。

另外,您是否考虑过将此添加到重写规则中?也许在规则级联之前处于顶端?

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

答案 1 :(得分:-1)

我建议你这个

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中,您可以轻松地将它们分解为具有单个变量的所有文件夹名称。