防止带有目录的url指向网页

时间:2010-10-12 13:00:40

标签: php apache mod-rewrite codeigniter

我有一个域名让我们称之为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我认为是因为它正在寻找确实存在的页面maindomain.com/about.php,但在newsite.com上不存在。

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

我想知道它是否和apache或PHP设置导致它首先查找文件,如果它存在而目录不存在?或者我是否需要添加更多的mod重写规则?

非常感谢!

编辑 - 这是我目前的.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]

3 个答案:

答案 0 :(得分:2)

询问我的托管公司的支持部门可能导致这种情况......事实证明它是由Apache MultiViews引起的。这可以通过

关闭

选项-MultiViews

在htaccess文件中。那很有效。 感谢您的建议。

答案 1 :(得分:0)

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

答案 2 :(得分:0)

我假设如果你是一个apache用户,你可以使用.htaccess文件将URL重定向到你的'index'文件(让我们称之为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找到