【问题标题】:mod_rewrite is redirecting instedad of rewritingmod_rewrite 是重定向而不是重写
【发布时间】:2011-09-28 03:33:07
【问题描述】:

我一定遗漏了一些明显的东西,但我无法让它发挥作用

我想拥有带有子域的漂亮 url,但我想从文件中读取子域的内容而不是某些目录:

RewriteEngine On
RewriteBase /
Options +FollowSymlinks
RewriteCond %{HTTP_HOST} ^subdomain.example.com
RewriteRule (.*) http://example.com/subdomain.php

这些规则有效,但如果我输入 subdomain.example.com,我将 重定向 到 example.com/subdomain.php - 但我不希望这样,我只想在内部重写 url。 ..

非常感谢!我试过 [QSA, L],不工作。

【问题讨论】:

    标签: url mod-rewrite apache2 subdomain


    【解决方案1】:

    如果你替换这个:

    RewriteRule (.*) http://example.com/subdomain.php
    

    有了这个,我怀疑它会像你期望的那样工作:

    RewriteRule (.*) subdomain.php
    

    除非你真的想重定向到另一个域,否则不需要重写域,你只需要重写请求以指向适当的文件。事实上,正如您发现的那样,重写域会导致重定向。通常 RewriteRule 匹配域之后的所有请求,所以只匹配路径和查询。

    【讨论】:

    • 太棒了!现在更好了:) 但是经典综合症,现在不工作图像,css ...我怀疑第一条规则 RewriteCond %{HTTP_HOST} ^subdomain.example.com 正在重写所有内容,我试图用 $ 符号来限制它,但没有成功。
    • 您需要添加一个 RewriteCond 以排除您不想重写的文件,或者更改 RewriteRule 正则表达式以匹配您想要重写的那些文件。下面 Chris 的回答包括一些很好的 RewriteCond,用于排除存在的文件。
    • 似乎 %{HTTP_HOST}%{REQUEST_URI} 可以解决问题!我会更多地尝试它
    【解决方案2】:

    如果您有权访问您的域的 DNS 控件,而不是为此使用 mod rewrite,您可以使用指向同一本地目录的通配符(“%”或“*”)设置一个包罗万象的子域。在那里,您可以有一个 PHP 脚本,所有请求都被定向到使用:

    Options +FollowSymlinks
    RewriteEngine on
    RewriteBase /
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteRule ^(.+)$ /index.php?p=$1 [L]
    

    这会将所有请求运行到该 PHP 文件中。在那里,您可以检查所请求域的 $_SERVER 变量,以及检查子域的检查器。在那里,它可以使用诸如 file_get_contents() 子例程之类的东西将相关数据转发给客户端,并且如果发出的请求可能有效,但不会发送到该子域,则具有 404 或 403 标头响应。

    希望这是有道理的......

    【讨论】:

    • 我只需要几个子域,您的通用解决方案非常适合更多。谢谢
    • 这是我用的那个。我使用了一个与异常艺术类似的系统,以便轻松查看用户配置文件。您只需访问 http://$USERID$.mydomain.com/,它就会自动进入脚本并从那里开始。如果您还有静态内容,例如 css 或图像,您可以将它们上传到那里,并且 !-d 和 !-f 确保当有真实文件尝试运行时脚本不会尝试运行。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-10
    • 2015-07-09
    相关资源
    最近更新 更多