【问题标题】:Create a Catch-All Handler in PHP?在 PHP 中创建一个包罗万象的处理程序?
【发布时间】:2011-07-10 05:54:54
【问题描述】:

我想让一个 PHP 文件捕获并管理用户访问时将发生的事情:

http://profiles.mywebsite.com/sometext

sometext 是变化的。

例如可以是 someuser 也可以是 john 等。然后我想要一个 PHP 文件来处理来自该结构的请求。

我的主要目标是让某个 PHP 文件将我的站点用户重定向到他们相应的配置文件,但他们的配置文件与该 URL 结构不同。我的目标是为我的用户提供一种易于记忆的个人资料 URL。

感谢那些回答的人!

【问题讨论】:

    标签: php url redirect catch-all


    【解决方案1】:

    一个明显的方法是通过 404 errorDocument - 保存所有与 mod_rewrite 相关的混乱。

    【讨论】:

    • 如果服务器发送 404 响应代码,搜索引擎可能不会索引页面。所以如果你使用这个方法一定要发送一个200(OK)响应码。
    【解决方案2】:

    在 Apache 配置文件 [VirtualHost 或 Directory 指令] 或 .htaccess 文件中放入以下行:

    Options -MultiViews
    
    <IfModule mod_rewrite.c>
        RewriteEngine On
        RewriteBase /
        RewriteCond %{REQUEST_FILENAME} !-f
        RewriteCond %{REQUEST_FILENAME} !-d
        RewriteRule . /index.php [L,NC,QSA]
    </IfModule>
    

    它会静默地将所有与有效文件名或目录不对应的传入请求(上面代码中的RewriteCond确保这一点)重定向到 index.php 文件。此外,如您所见,还需要禁用 MultiViews 选项才能进行重定向 - 它通常与我放在那里的这两个 RewriteCond 冲突。

    在 index.php 中,您可以通过 $_SERVER['REQUEST_URI'] 变量访问 REQUEST_URI 数据。您不应通过 GET 传递任何 URI,因为它可能会以不希望的方式污染您的 Query-String 数据,因为我们的 RewriteRule 中的 [QSA] 参数处于活动状态。

    【讨论】:

    • 谢谢!我要去试试这个! :) 嗯,URL 缩短网站也使用这种方法吗?
    • 否 :) 那是另一个话题。
    • 哦,好吧,将来某个时候会发布这个,但现在,应该这样做。 :)
    【解决方案3】:

    你应该使用重写规则..

    在 apache (.htaccess) 中,类似这样:

    <IfModule mod_rewrite.c>
        RewriteEngine On
    
        RewriteCond %{REQUEST_FILENAME} !-d
        RewriteCond %{REQUEST_FILENAME} !-f
        RewriteRule ^(.*)$ /index.php?url=$1 [QSA,L]
    </IfModule>
    

    然后在您的 index.php 中,您可以在 php 代码中读取 $_GET['url']。

    【讨论】:

      【解决方案4】:

      如果你还没有听说过 MVC,是时候听听它了,从 CodeIgniter 开始,它最简单,速度也很快,使用默认控制器,你可以有类似的 URL
      domain.com/usernam/profile
      domain.com/usernam/profile/editdomain.com/usernam/inbox
      domain.com/usernam/inbox/read/messageid 或者明智地使用.htaccess

      【讨论】:

        【解决方案5】:

        您可以使用 .htaccess 文件 (http://httpd.apache.org/docs/1.3/howto/htaccess.html) 将您的 url 重写为 profile.websites.com/index.php?page=sometext 之类的内容。然后你可以用 index.php 中的 sometext 做你想做的事。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-07-23
          • 1970-01-01
          • 2019-01-27
          相关资源
          最近更新 更多