【问题标题】:Prevent url with a directory from pointing to a web page防止带有目录的 url 指向网页
【发布时间】:2010-10-12 13:00:39
【问题描述】:

我有一个域,我们称之为 newsite.com,它停在 maindomain.com。我使用 mod-rewrite 将所有对 newsite.com 的请求定向到 maindomain.com 上的子目录。在 newsite.com 上,我安装了 CodeIgniter。这意味着网址看起来像这样:

newsite.com/products/shoes/

上面的工作正常。

但是,如果我为这样的页面设置控制器:

newsite.com/about/newsite.com/about/faqs/

我得到一个 404,我认为这是因为它正在寻找确实存在但在 newsite.com 上不存在的页面 maindomain.com/about.php。

我的问题是....如何防止像 newsite.com/about/ 这样的网址指向 newsite.com/about.php ?这与许多人试图做的相反(他们倾向于允许缺少文件扩展名)。

我想知道是否是 apache 或 PHP 设置导致它首先查找文件(如果文件存在而目录不存在)?还是我需要添加更多的 mod-rewrite 规则?

非常感谢!

编辑 - 这是我目前的 .htaccess 文件。它位于 maindomain.com 共享主机帐户的 Web 根目录中。

# Redirect various urls to subfolders of the format: /site-thename/

RewriteEngine On

# Remove the www for NewSite.
RewriteCond %{HTTP_HOST} ^www.newsite.com$ [NC]
RewriteRule ^(.*)$ http://newsite.com/$1 [R=301,L]

# Handle pages and directories that should not go through CodeIgniter.
RewriteCond %{HTTP_HOST} ^(www\.)?newsite\.com
RewriteCond %{REQUEST_URI} !^/site-newsite/
RewriteCond %{REQUEST_URI} ^/demo/ [OR]
RewriteCond %{REQUEST_URI} ^/robots\.txt [OR]
RewriteCond %{REQUEST_URI} ^/emailform\.php [OR]
RewriteCond %{REQUEST_URI} ^/assets/ [OR]
RewriteCond %{REQUEST_URI} ^/index\.php
Rewriterule ^(.*)$ /site-newsite/$1 [L]


# Handle CodeIgniter URLs.
RewriteCond %{HTTP_HOST} ^(www\.)?newsite\.com
RewriteCond %{REQUEST_URI} !^/site-newsite/
Rewriterule ^(.*)$ /site-newsite/index.php?/$1 [L]

【问题讨论】:

  • 您可以从新网站发布您的 .htaccess 内容吗?
  • 好的。添加了 htaccess 文件内容。
  • 当我在 404 页面上转储 phpinfo 时,我可以看到:_SERVER["QUERY_STRING"] = /about.php/ 所以它以某种方式将目录更改为 php 页面。

标签: php apache mod-rewrite codeigniter


【解决方案1】:

询问我的托管公司的支持部门可能是什么原因造成的……结果证明这是由 Apache MultiViews 引起的。这可以通过

关闭

选项 - 多视图

在 htaccess 文件中。那行得通。 感谢您的建议。

【讨论】:

    【解决方案2】:

    如果您没有重写规则,Apache 默认会引用文件系统上的任何内容。你必须有重写规则来告诉 Apache 使用特定的控制器来处理请求,而不是尝试引用文件系统上的对象。

    【讨论】:

    • 我发现如果我完全删除我的 .htaccess 文件,当我转到 /about/ 时,它仍然会为 about.php 提供服务。所以...我想知道这是否可以是服务器设置。
    【解决方案3】:

    我假设如果您是 apache 用户,您使用 .htaccess 文件将 URL 重定向到您的“索引”文件(我们称之为 index.php)。你也应该有这样的东西:

    RewriteEngine on
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteRule .* index.php
    

    在您的 .htaccess 文件中。请注意,RewriteCond 条件有一个 参数,用于检查它是否不是 文件 :-) 更多信息可以在 http://httpd.apache.org/docs/2.0/mod/mod_rewrite.html#rewritecond

    找到

    【讨论】:

    • 是的,我正在使用 Apache 和 .htaccess 进行重定向。上面添加了完整的 Mod 重写规则。
    • 尝试将 !-f 参数添加到条件中。它应该首先检查它是否是文件。
    • 对不起。当我阅读你的问题时,我不够小心。如果我说得对,您尝试在您的主机上的 root 子文件夹(例如 maindomain)中设置新域?
    • 感谢您的 cmets Bery。我发现是 Apache MultiViews 设置造成的。
    猜你喜欢
    • 2011-10-13
    • 1970-01-01
    • 2021-09-05
    • 2012-08-02
    • 2015-02-16
    • 1970-01-01
    • 2012-05-27
    • 1970-01-01
    • 2014-09-16
    相关资源
    最近更新 更多