问题描述
||
我有以下网址...
http://localhost/http.mygarble.com/foundationsofwebprogramming/86
...我想转换为以下内容:
http://localhost/http.mygarble.com/PHP/blog.PHP?subdomain = foundationsofwebprogramming&page = posts&label = 86
我认为我可以通过以下规则来实现:
RewriteRule ([^/]+)/([^/]+)$ PHP/blog.PHP?subdomain=$1&page=post&label=$2 [NC,L]
但是,我发现此规则反复应用,导致内部服务器错误。我了解到,使用此规则转换URI时,结果URI也将与该规则匹配,因此将它无限制地再次应用。
我以前的(非常朦胧的)理解是[L]标志将停止进一步处理,尽管我现在理解这仅意味着仅跳过其余规则,并且不会停止重新运行规则的重写引擎。 。
我可以通过添加以下条件来解决此问题:
RewriteCond $0 !PHP/blog.PHP
RewriteRule ([^/]+)/([^/]+)$ PHP/blog.PHP?subdomain=$1&page=post&label=$2 [NC,L]
...或者通过编写更具体的正则表达式。但是我真正想做的是找到一种方法,一旦该规则被匹配一次,就可以阻止重写引擎尝试任何进一步的匹配。这可能吗?
非常感谢。
解决方法
通常使用2种方法。
第一个是重写条件测试,测试请求的文件不是真实文件。当内部递归出现时,您的php / blog.php是一个真实文件,并且第二次不执行重写程序。副作用是对文件存在的任何请求都不会被重写(这可能是很好的副作用)
RewriteCond %{REQUEST_FILENAME} !-f
第二种解决方案是使用以下方法检查您是否处于内部重定向中:
RewriteCond %{ENV:REDIRECT_STATUS} ^$
第二种解决方案的副作用是,如果之前应用了一些其他规则(如果您实际上希望在第一次重写之后运行一些内部重定向,则无法应用rewriteRule)。
编辑
为了完成操作,我将添加第三个方法:[NS]或[nosubreq]标签似乎在做相同的事情。内部重定向后防止使用规则。
, 第三种方法是将Apache升级到2.3.9或更高版本,并使用[END]标志而不是[L]。
没有副作用