【问题标题】:How Do I Disable Unwanted Requests? (MySQL, .htaccess, PHP)如何禁用不需要的请求? (MySQL、.htaccess、PHP)
【发布时间】:2011-10-17 20:01:46
【问题描述】:

首先,我是 PHP 和 .htaccess 的初学者。这是我的困境...

我已经构建了动态页面并使用 htaccess 重写了 url。页面有 3 种类型...示例:

状态:example.com/massachusetts-colleges.html

城市:example.com/massachusetts-colleges/boston-ma-colleges.html

学院:example.com/massachusetts-colleges/boston-ma-colleges/harvard.html

问题是请求的页面(可能来自旧的链接结构)不应该存在,例如:

example.com/boston-ma-colleges.html

州网址存储在数据库中的位置表中 (stateSlug = massachusetts-colleges)。城市 url 也存储在数据库的位置表中,相应的州信息也与该城市一起存储(citySlug = boston-ma-colleges 和 stateSlug = massachusetts-colleges)。学院存储在不同的表中,并使用 ID 与城市相对应。

如何使用 .htaccess 防止任何“其他”网址被访问(页面显示模板且无数据),并显示 404 页面(或重定向到主页)?

这就是我的 .htaccess 文件现在的样子:

RewriteEngine on
RewriteRule ^([^/\.]+)\.html?$ php/statePage.php?stateSlug=$1 [L]
RewriteRule ^([^/\.]+)-colleges/([^/\.]+)\.html?$ php/cityPage.php?citySlug=$2&stateSlug=$1 [L]
RewriteRule ^([^/\.]+)-colleges/([^/\.]+)/([^/\.]+)\.html?$ php/collegePage.php?collegeSlug=$3&citySlug=$2&stateSlug=$1 [L]

再次,我对 htaccess 和 php 语言有些陌生。在这件事上我将不胜感激。

谢谢!

【问题讨论】:

    标签: php mysql .htaccess mod-rewrite


    【解决方案1】:

    假设您的所有内容都与上述网址之一匹配,您可以通过在末尾添加另一条规则来简单地禁止访问其他所有内容:

    RewriteRule ^(.*)$ - [F]
    

    为避免混淆您的图像和 CSS 请求,您应该添加:

    RewriteCond %{REQUEST_FILENAME} !\.(jpg|png|gif|js|css)$ [NC]
    RewriteRule ^(.*)$ - [F]
    

    如果您有应该设置为不可访问的目录,请在其中放置一个 .htaccess,其中仅包含以下内容:

    Order deny,allow
    deny from all
    

    【讨论】:

    • 我刚刚尝试添加您告诉我的内容,但它导致应该显示的页面上出现“禁止”...
    【解决方案2】:

    尝试以下操作,但将 index.php 替换为您的 404 页面:

    Order allow,deny
    Allow from all
    RewriteEngine On
    
    RewriteBase /
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteRule ^(.*)$ index.php?/$l [L]
    

    这应该将所有未找到的文件和目录请求重定向到 index.php 或您选择的脚本文件,例如 404 页面。请记住将标头设置为 404 响应代码。

    我从 CodeIgniter wiki 页面http://codeigniter.com/wiki/mod_rewrite/ 得到这个

    当我尝试解决类似问题时,他们的 wiki 页面非常有帮助。

    【讨论】:

      【解决方案3】:

      将所有公共文件重写到伪造目录/allow/..,对于不在/allow/.. 目录中的任何请求,显示404。最后将文件从/allow/..重写到真实目录。

      这是 IMO 的绝佳解决方法 :) 比在每个目录中使用 deny all 更好...

      【讨论】:

      • 谢谢...我最终找出了一些不在 htaccess 中的东西...我使用页面代码检查数据库中的 slug,如果不是,则将标题更改为 404在那里。
      猜你喜欢
      • 1970-01-01
      • 2021-12-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多