RewriteRule,字符串以“http://”开头

时间:2009-11-05 02:44:05

标签: apache .htaccess mod-rewrite

我在解决如何使用htaccess执行以下操作时遇到问题:

http://isitup.org/http://example.com => http://isitup.org/example.com

我认为问题是第二个双斜线,但我想不出解决方案。

这是我当前(失败)的尝试:

RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^http://([^/.]+\.[^/]+)/?$ /$1 [R=301,NC,L]

RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^([^/.]+\.[^/]+)/$ /$1 [R=301,NC,L]

RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^([^/.]+\.[^/]+)$ check.php?domain=$0 [QSA,L]

谢谢:)

3 个答案:

答案 0 :(得分:1)

那么,你重复的那种模式应该是([^/]+\.[^/.]+),但只有当有两个以上元素的DNS名称出现时,这才会很重要。

您的主要问题可能是最后一次重定向应该是/check.php?domain=$1。除非mod_rewrite一般会因为那不是有效的W3C URL而窒息。但我们可以希望。

答案 1 :(得分:1)

改为测试原始请求行:

RewriteCond %{THE_REQUEST} ^GET\ /http://([^/\ ]+)
RewriteRule ^http:/ /%1 [R=301,NC,L]

原因是Apache删除了请求URL中的多个斜杠。

答案 2 :(得分:0)

如果我没记错的话,RewriteRule在服务器信息之后启动。因此,在网址http://www.server.com/path/to/file中,^将在/path/to/file开始匹配。

因此,如果您正在创建如上所述的网址,那么您实际上需要匹配第一个/

RewriteRule ^/http://([^/]*)/(.*)$ /$1/htdocs/$2 [R, NE]

这应该使您能够映射以下内容:
http://isitup.org/http://example.com/path => http://isitup.org/example.com/htdocs/path

如果您要提供虚拟主机,则可以考虑使用Alias或基于名称的VirtualHost代替。