我的.htaccess文件目前看起来像这样:
RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule /?([A-Za-z0-9-]+)/?$ index.php?page=$1 [QSA,L]
它适用于http://site.com/aaaaa等网址,但对于http://site.com/aaaa/bbb这样的网址,$ _GET ['page']变量只包含bbb而不是aaaaa / bbb。
有没有办法获取页面变量中的所有子目录?
答案 0 :(得分:1)
我建议将/
添加到最后一行中接受的字符列表中:/?([A-Za-z0-9/-]+)/?$
。
答案 1 :(得分:1)
在这一行:
RewriteRule /?([A-Za-z0-9-]+)/?$ index.php?page=$1 [QSA,L]
您错过了^
以匹配整个字符串。此外,在您的字符串中,您希望匹配网址中的/
。所以应该是:
RewriteRule ^/?([A-Za-z0-9-/]+)/?$ index.php?page=$1 [QSA,L]
错过^
会让你获得最后一次不匹配的比赛。
答案 2 :(得分:1)
为什么不捕获一切?
像这样,我想:
RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule (.*) temp.php?page=$1 [QSA,L]
使用此(考虑到我的脚本位于temp
文件夹中),http://tests/temp/blah
和http://tests/temp/blah/glop
都被重定向到t emp.php
,{{1含有'blah'或$_GET['page']
。
这通常是使用Zend Framework完成的,例如(参见here参考)。
答案 3 :(得分:0)
你有没有理由使用这些字符范围?
为什么不使用:
RewriteRule ^(.*)$ index.php?page=$1
同样危险的是使用这样的东西你可能会错过“页面”GET变量。我不确定哪个优先,但要么是不好的行为。
我见过这种行为的示例不会将路径作为GET参数传递,而是使用php从$_SERVER['REQUEST_URI')
答案 4 :(得分:0)
如果您只想允许每个path segments中的字符[A-Za-z0-9-]
,请尝试以下操作:
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^/?([A-Za-z0-9-]+(/[A-Za-z0-9-]+)*)/?$ index.php?page=$1 [QSA,L]
顺便说一句:你应该选择一种拼写,有或没有斜杠,如果它是另一种形式,则重定向。