【发布时间】:2013-05-02 01:17:18
【问题描述】:
到目前为止,我已经搜索了 4 个小时,但仍然无法正常工作。 我的 webroot 中有以下目录:
- application
- assets
- css
- config
- protected
- .htaccess
- ...
- .htaccess
- framework
- [Yii framework inside]
- .htaccess
只要请求的文件或目录不存在,我的 webroot 中的 .htaccess 应该重定向/“重写”所有对 xxx/xxx 的请求到 http://www.example.com/application/。 这样对 .css、.js 和其他文件的请求仍然可以工作。
在我的配置中,我确保 Yii 期望 SEO 友好的 URL,并且我不倾向于使用 index.php。所以它现在看起来像这样:
'urlManager'=>array(
'urlFormat'=>'path',
'showScriptName'=>false,
'rules'=>array(
'' => 'site/index',
'<controller:\w+>/<id:\d+>'=>'<controller>/view',
'<controller:\w+>/<action:\w+>/<id:\d+>'=>'<controller>/<action>',
'<controller:\w+>/<action:\w+>'=>'<controller>/<action>',
),
),
'request' => array(
'baseUrl' => 'http://www.example.com',
),
“请求”是后来添加的,因为 Yii 生成链接为 example.com/application/site/login。 Yii 使用请求生成 example.com/site/login。
在我的 webroot 中的 .htaccess 中,我尝试了一切。
- 首先,我能够从 URL 中“删除”子目录。已显示索引页。
- 我尝试添加一条规则,以便将所有不存在的目录重定向到相同的 url。
- 我的第一条规则被打破,“应用程序”再次出现在 URL 中,但没有加载任何 css 样式。
- 此时我得到了带有 css 的索引页面,但现在一切都将我带到了索引页面。
我的 .htaccess 看起来像这样:
RewriteEngine on
RewriteCond $1 !^application/
# if a directory or a file exists, use it directly
RewriteCond %{DOCUMENT_ROOT}/application/$1 -f [OR]
RewriteCond %{DOCUMENT_ROOT}/application/$1 -d
RewriteRule ^(.*)$ application/$1 [L]
# otherwise forward it to index.php
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{HTTP_HOST} ^(www.)?example.com$
RewriteRule ^.*$ application/index.php
Mod_rewrite 已启用(我知道是因为有些事情以前有效)。我查看了来自Yii docs 的示例。 我尝试了 Stack Overflow 上其他问题的解决方案,例如 one 和许多其他问题。 还是没有运气。
有人可以帮帮我吗?
编辑: 使用上面的 .htaccess 对 example.com 的请求以 example.com/application 结尾。但是我想再次使“应用程序”“不可见”(以前工作过,不知道为什么它坏了)
我确实更改了我的 .htaccess,如下所示:
RewriteEngine on
RewriteCond $1 !^application/
# if a directory or a file exists, use it directly
RewriteCond %{DOCUMENT_ROOT}/application/$1 -f [OR]
RewriteCond %{DOCUMENT_ROOT}/application/$1 -d
RewriteRule ^(.*)$ application/$1 [L]
# otherwise forward it to index.php
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^([^/]+)/([^/]+)$ /application/
RewriteCond %{HTTP_HOST} ^(www.)?brainfeeder.be$
RewriteRule ^$ application/$1 [L,QSA]
但仍然像 www.brainfeeder.be/site/login 这样的网址将我带到默认控制器/操作,即站点/索引。 我想我的条件或规则还不完全正确。 请查看我的 small test application 我设置来解决这个问题。
会发生什么:brainfeeder.be 被重写为brainfeeder.be/application/ 我的Yii 应用程序在那里,所以它运行'bootstrap' index.php 文件并进入默认的控制器/动作,在这种情况下是站点/索引. 现在,当您单击“登录”按钮时,它应该会显示一个登录表单。但它停留在站点/索引视图中。
好的,我再次更新了我的 .htaccess 几次。现在我有以下情况:
- www.example.com AND example.com 被重写为 www.example.com/application AND example.com/application。
- (www.)?example.com/existingfolder 只显示“现有文件夹”的内容。
- (www.)?example.com/var1/var2/../varn 被重定向到 (www.)?example.com/application/var1/var2/.../varn
现在我唯一希望发生的事情是后者被重写而不是重定向。所以访问者不知道他们在目录“应用程序”中。
所以 (www.)?example.com/var1/var2/.../varn 会将访问者直接带到正确的页面。
目前我的.htaccess的内容:
Options +FollowSymLinks
#IndexIgnore */*
RewriteEngine on
RewriteBase /
RewriteCond %{HTTP_HOST} ^(www.)?brainfeeder.be$
RewriteRule ^$ /application/ [L]
# if a directory or a file exists, use it directly
RewriteCond %{REQUEST_FILENAME} -s [OR]
RewriteCond %{REQUEST_FILENAME} -l [OR]
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule ^.*$ - [L]
# The directory or file does not exist
RewriteCond %{REQUEST_FILENAME} !-s [OR]
RewriteCond %{REQUEST_FILENAME} !-l [OR]
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ /application/$1 [L,R]
问题是,当在最后一个 RewriteRule 中丢失 R 标志时,会将我带到“应用程序”内的 index.php 文件,但是当我访问 example.com/ 时,它会显示主页而不是登录表单网站/登录。
我猜,脚本看不到变量。 (如果它确实会触发站点/错误)因此它会将其作为对 example.com/application 的请求而不是作为 example.com/application/var1/var2 的请求来处理
我希望这次我确实更好地解释了这个问题。 感谢您迄今为止的大力帮助。
【问题讨论】:
标签: php apache .htaccess mod-rewrite yii