我有一个索引文件,可根据 n PATH_INFO变量构建内容。
示例:
site.com/A/B/n/
应该使用index.php:
site.com/index.php?var1=A&var2=B&varN=n
- or -
site.com/index.php/A/B/n/
而不是:
site.com/A/B/n/index.php || which doesn't exist ||
到目前为止,我尝试过多种变体:
RedirectMatch ^/.+/.*$ /
没有成功。
我在这里有一个不优雅且不可扩展的解决方案:
RewriteEngine On
RewriteRule ^([a-zA-Z0-9_-]+)/?$ index.php?p1=$1 [NC,L]
RewriteRule ^([a-zA-Z0-9_-]+)/([a-zA-Z0-9_-]+)/?$ index.php?p1=$1&p2=$2 [NC,L]
RewriteRule ^([a-zA-Z0-9_-]+)/([a-zA-Z0-9_-]+)/([a-zA-Z0-9_-]+)/?$ index.php?p1=$1&p2=$2&p3=$3 [NC,L]
RewriteRule ^([a-zA-Z0-9_-]+)/([a-zA-Z0-9_-]+)/([a-zA-Z0-9_-]+)/([a-zA-Z0-9_-]+)/?$ index.php?p1=$1&p2=$2&p3=$3&p4=$4 [NC,L]
此解决方案存在问题:
你能帮忙吗?
答案 0 :(得分:6)
选项1:(site.com/index.php?var1=A&var2=B&varN=n
):
Options +FollowSymLinks -MultiViews
RewriteEngine On
# do not do anything for already existing files
RewriteCond %{REQUEST_FILENAME} -f [OR]
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule .+ - [L]
RewriteRule ^([^/]+)/?$ index.php?p1=$1 [QSA,L]
RewriteRule ^([^/]+)/([^/]+)/?$ index.php?p1=$1&p2=$2 [QSA,L]
RewriteRule ^([^/]+)/([^/]+)/([^/]+)/?$ index.php?p1=$1&p2=$2&p3=$3 [QSA,L]
RewriteRule ^([^/]+)/([^/]+)/([^/]+)/([^/]+)/?$ index.php?p1=$1&p2=$2&p3=$3&p4=$4 [QSA,L]
1。您有[NC]
标记...因此您的模式中无需A-Z
。
2。而不是[a-zA-Z0-9_-\+\=\&]
或[a-zA-Z0-9_-]
我使用[^/]
,这意味着除了斜杠/ 之外的任何字符。
3。添加了[QSA]
标志以保留现有查询字符串。
选项2:(site.com/index.php/A/B/n/
):
Options +FollowSymLinks -MultiViews
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule (.*) index.php/$1 [L]
实际上,如果您不打算在任何地方显示该网址(例如,301重定向等),最后一行可以轻松替换为RewriteRule .* index.php [L]
- 您将使用{{1}查找原始网址无论如何,在你的PHP代码中。
答案 1 :(得分:3)
添加以下内容会将所有流量(对于不存在的文件)重定向到索引页面:
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*) index.php [NC]
然后,您可以通过解析'REQUEST_URI'
在index.php中做出决定答案 2 :(得分:0)
RewriteRule ^ /。+ / [R = 301,L]
任何超出root路径的网址都会被重定向到root。
^ = start of url
/ = a slash
.+ = 1 or more characters