我在解决如何使用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]
谢谢:)
答案 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
代替。