我有以下.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
(如果路径太短,dir2
到dir5
将为空)
有没有办法直接在.htaccess文件中执行此操作,还是需要在php中处理它?</ p>
答案 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中,您可以轻松地将它们分解为具有单个变量的所有文件夹名称。