.htaccess规则被忽略了没有明显的原因

时间:2017-03-11 18:02:42

标签: php apache .htaccess

我的web项目的目录结构如下所示:

webroot/
├── web/
│   ├── backend/
│   │   ├── endpoint/
│   │   │   └── endpoint.php
│   │   └── ...
│   └── frontend/
│       ├── app/
│       │   └── ...
│       ├── assets/
│       │   └── ...
│       ├── index.html
│       └── app.js
└── .htaccess

如您所见,我的前端(AngularJS)位于/web/frontend。为了能够使用更简单的规范网址访问应用,我创建了以下.htaccess文件,该文件基本上将www.example.com/映射到www.example.com/web/frontend/

RewriteEngine On
RewriteBase /

# 1: css/js/img files
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^assets/(.*)$ web/frontend/assets/$1 [QSA,L]

# 2: AngularJS app/files
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^app/(.*)$ public/frontend/app/$1 [QSA,L]

# 3: Backend/API -- this rule seems to be ignored
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^endpoint/(.*)$ web/backend/endpoint/$1 [QSA,L]

# 4: redirect to canonical URL
RewriteCond %{THE_REQUEST} public/frontend/
RewriteRule ^web/frontend/(.*) http://<host>/$1 [R=301,L]

# 5: everything else to be routed by AngularJS
RewriteCond %{REQUEST_URI} !web/frontend/
RewriteRule ^(.*)$ /web/frontend/#/$1 [L]

这适用于前端部分,这意味着应用程序 - 包括所有资产 - 由浏览器正确加载。

我正在努力的事情基本上就是后端访问。根据我的理解,我应该能够通过/web/backend/endpoint/endpoint.php?foo=bar检索/endpoint/endpoint.php?foo=bar,因为规则#3告诉Apache这样做。

相反,每当我转到/endpoint/endpoint.php?foo=bar时,服务器都会返回前端的index.html(这意味着执行了规则#5)。

我错过了什么?

1 个答案:

答案 0 :(得分:0)

此规则中存在一些语法错误,请查看。如果您对此进行评论,那么重定向到端点将按预期工作。

# 5: everything else to be routed by AngularJS
RewriteCond %{REQUEST_URI} !web/frontend/
RewriteRule ^(.*)$ /web/frontend/#/$1 [L]

因此您需要使用正确的语法修复规则#5,否则您的php文件将无法映射,并且由于.htaccess文件中的错误,它将不允许执行php文件。