Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/.htaccess/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 将特殊子域重写为特殊脚本,并将所有子域捕获为脚本_Php_.htaccess_Mod Rewrite_Subdomain_Wildcard Subdomain - Fatal编程技术网

Php 将特殊子域重写为特殊脚本,并将所有子域捕获为脚本

Php 将特殊子域重写为特殊脚本,并将所有子域捕获为脚本,php,.htaccess,mod-rewrite,subdomain,wildcard-subdomain,Php,.htaccess,Mod Rewrite,Subdomain,Wildcard Subdomain,我无法为.htaccess文件创建脚本 我想重写以下内容: www.domain.tld->domain.tld(没问题) admin.domain.tld/(.*)->domain.tld/?show=admin$1 (everyothersubdomain.domain.tld->domain.tld/?show=everyothersubdomain(我为此创建了一个通配符子域) 有人擅长这个吗?我在多次尝试后失败,错误为500,或者只是没有任何get参数的indexpage(inde

我无法为.htaccess文件创建脚本

我想重写以下内容:

  • www.domain.tld->domain.tld
    (没问题)
  • admin.domain.tld/(.*)->domain.tld/?show=admin$1
  • (everyothersubdomain.domain.tld->domain.tld/?show=everyothersubdomain
    (我为此创建了一个通配符子域)
有人擅长这个吗?我在多次尝试后失败,错误为500,或者只是没有任何get参数的indexpage(index.php只是print\r($\u get))


谢谢

我自己还没有测试过,但应该可以用

RewriteCond  %{QUERY_STRING}  show=(.*)
RewriteRule  ^(index\.php|)$   http://%1.domain.tld  [R=301,L]
RewriteRule ^(admin|special1|special2)\.php    http://$1.domain.tld [R=301,L]
RewriteCond %{HTTP_HOST} ^(admin|special1|special2)\.domain\.tld$  [NC]
RewriteRule (.*) http://domain.tld/%1.php [L,NC,QSA]

RewriteCond %{HTTP_HOST}  www\.domain\.tld  [NC]
RewriteRule (.*)  http://domain.tld/$1  [L,R=301,QSA]

RewriteCond  %{HTTP_HOST}  ^(.*)\.domain\.tld$
RewriteRule (.*)  http://domain.tld/?show=%1[L,NC,QSA]

如果用户输入
http://domain.tld/admin.php
在他的浏览器中,他将被重定向到
http://admin.domain.tld
。但是如果他输入
http://admin.domain.tld
,他将不会被重定向到外部。如果这是您想要的,请告诉我。

我自己还没有测试过,但它应该可以工作

RewriteCond  %{QUERY_STRING}  show=(.*)
RewriteRule  ^(index\.php|)$   http://%1.domain.tld  [R=301,L]
RewriteRule ^(admin|special1|special2)\.php    http://$1.domain.tld [R=301,L]
RewriteCond %{HTTP_HOST} ^(admin|special1|special2)\.domain\.tld$  [NC]
RewriteRule (.*) http://domain.tld/%1.php [L,NC,QSA]

RewriteCond %{HTTP_HOST}  www\.domain\.tld  [NC]
RewriteRule (.*)  http://domain.tld/$1  [L,R=301,QSA]

RewriteCond  %{HTTP_HOST}  ^(.*)\.domain\.tld$
RewriteRule (.*)  http://domain.tld/?show=%1[L,NC,QSA]

如果用户输入
http://domain.tld/admin.php
在他的浏览器中,他将被重定向到
http://admin.domain.tld
。但是如果他输入
http://admin.domain.tld
,他将不会被重定向到外部。如果这是你想要的,请告诉我。

多亏了@Death,我为自己想出了这个解决方案:

RewriteCond %{HTTP_HOST} ^(admin|special1|special2)\.domain\.tld$  [NC]
RewriteRule (.*) index.php?mode=%1 [L,NC,QSA]

RewriteCond %{HTTP_HOST}  www\.domain\.tld  [NC]
RewriteRule (.*)  http://domain.tld/$1  [L,R=301,QSA]

RewriteCond  %{HTTP_HOST}  ^(.*)\.domain\.tld$
RewriteRule (.*)  index.php?show=%1 [L,NC,QSA]
我使用index.php进行了一些测试,它只是:



每次测试都进行得很完美

多亏了@Death,我为自己想出了这个解决方案:

RewriteCond %{HTTP_HOST} ^(admin|special1|special2)\.domain\.tld$  [NC]
RewriteRule (.*) index.php?mode=%1 [L,NC,QSA]

RewriteCond %{HTTP_HOST}  www\.domain\.tld  [NC]
RewriteRule (.*)  http://domain.tld/$1  [L,R=301,QSA]

RewriteCond  %{HTTP_HOST}  ^(.*)\.domain\.tld$
RewriteRule (.*)  index.php?show=%1 [L,NC,QSA]
我使用index.php进行了一些测试,它只是:



每次测试都进行得很完美

您可能需要将
R=301
标志添加到其他规则中。如果不这样做,重定向将在服务器端以静默方式进行。有了它,它被传递回客户端,以便客户端浏览器知道重定向;它可以缓存它,并在未来自动完成。这并不完全是我想要的,但这是一个好的开始——谢谢你。我真的希望它是安静的。我可能有点不具体,我会尝试做一个更好的例子:浏览器显示:
admin.domain.tld
->服务器端:
domain.tld/admin.php
或浏览器:
(anyotherdomain.domain.tld
->服务器:
domain.tld/index.php?show=(anyotherdomain)
,所以我基本上只想让这些域更丰富一些“catchier”,因此没有丑陋的index.php?show=XXXXX,而是一个XXXXX.domain.tld。但线索是,我想要一些“保留”子域,用于我可以定义的特殊脚本,例如admin.php“几乎”"! 它是以重定向的方式工作的,正如我所说的,这是唯一一件用户可以看到
domain.tld/index.php?=XXXXX
版本的事情,但我不希望他们这样做,他们应该总是能够看到“子域版本”。因此,这似乎不是“重写”,而不是重定向。我进行了一些测试运行,但它总是将URL更改为您在重写规则中提到的URL。
301
http状态代码缓存在您的浏览器中,请删除缓存,然后再次测试!好吧,又没用了。但这次我自己解决了。第一个问题是,前3行导致未按比例重定向,因此我将它们注释掉(对我来说不是必需的)。在尝试了一些其他标志(代理)之后,我发现它非常简单。这就是问题所在!所以我删除了它,这样所有的东西都可以直接指向index.php!这就解决了问题。我将提出解决方案作为另一个答案,但如果没有你,这是不可能的。谢谢你刚刚救了我一天;)您可能需要将
R=301
标志添加到其他规则中。如果不这样做,重定向将在服务器端以静默方式进行。有了它,它被传递回客户端,以便客户端浏览器知道重定向;它可以缓存它,并在未来自动完成。这并不完全是我想要的,但这是一个好的开始——谢谢你。我真的希望它是安静的。我可能有点不具体,我会尝试做一个更好的例子:浏览器显示:
admin.domain.tld
->服务器端:
domain.tld/admin.php
或浏览器:
(anyotherdomain.domain.tld
->服务器:
domain.tld/index.php?show=(anyotherdomain)
,所以我基本上只想让这些域更丰富一些“catchier”,因此没有丑陋的index.php?show=XXXXX,而是一个XXXXX.domain.tld。但线索是,我想要一些“保留”子域,用于我可以定义的特殊脚本,例如admin.php“几乎”"! 它是以重定向的方式工作的,正如我所说的,这是唯一一件用户可以看到
domain.tld/index.php?=XXXXX
版本的事情,但我不希望他们这样做,他们应该总是能够看到“子域版本”。因此,这似乎不是“重写”,而不是重定向。我进行了一些测试运行,但它总是将URL更改为您在重写规则中提到的URL。
301
http状态代码缓存在您的浏览器中,请删除缓存,然后再次测试!好吧,又没用了。但这次我自己解决了。第一个问题是,前3行导致未按比例重定向,因此我将它们注释掉(对我来说不是必需的)。在尝试了一些其他标志(代理)之后,我发现它非常简单。这就是问题所在!所以我删除了它,这样所有的东西都可以直接指向index.php!这就解决了问题。我将提出解决方案作为另一个答案,但如果没有你,这是不可能的。谢谢你刚刚救了我一天;)一些测试结果:
admin.domain.tld->Array([mode]=>admin)
asdf.domain.tld->Array([show]=>asdf)
一些测试结果:
admin.domain.tld->Array([mode]=>admin)
asdf.domain.tld->Array([show]=>asdf)