我有一个域名让我们称之为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]
答案 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找到