如何将所有请求重定向到 apache2 子目录内的 PHP 文件?
How to redirect all requests to a PHP file inside a subdirectory in apache2?
我的文档根目录是 /var/www/html/
。
我在里面创建了一个名为myapi的目录,如/var/www/html/myapi
。
/var/www/html/myapi
中的文件夹结构类似于
.
|-- .htaccess
|-- composer.json
|-- composer.lock
|-- src
| |-- config
| |-- index.php
`-- vendor
我希望将所有请求(例如 http:localhost/myapi/books
重定向到 src 文件夹内的 index.php。
我当前的 .htaccess
设置:
RewriteEngine On
RewriteCond %{REQUEST_URI} !(\.png|\.jpg|\.gif|\.jpeg|\.zip|\.css|\.svg|\.js)$
RewriteRule (.*) src/index.php [QSA,L]
RewriteEngine 已经开启。
但是不行,服务器也没有响应。
我可以知道怎么做吗?
编辑:已修复。我搞砸了 docker 容器中 .htaccess 文件的一些卷挂载。
在 .htaccess 中使用以下代码。我希望它应该工作
RewriteEngine On
RewriteCond %{REQUEST_URI} !(\.png|\.jpg|\.gif|\.jpeg|\.zip|\.css|\.svg|\.js)$
RewriteRule (.*) src/index.php?page= [QSA,L]
RewriteCond %{REQUEST_URI} !(\.png|\.jpg|\.gif|\.jpeg|\.zip|\.css|\.svg|\.js)$
RewriteRule (.*) src/index.php [QSA,L]
...may I know how my .htaccess could be improved?
正如我在评论中提到的,这是“好的”,但可以改进。
此规则不必要地重写为自身。这里没有 rewrite-loop,因为您正在重写静态 file-path。 (但是在 substitution 字符串上包含一个斜杠前缀,你会得到一个 rewrite-loop - 500 内部服务器错误。)
没有必要捕获整个 URL-path(即 (.*)
),因为它没有被使用。
检查请求是否以已知文件扩展名结尾的条件可以移动到RewriteRule
模式. (不需要 RewriteCond
指令。)从正则表达式交替中删除点以“简化”正则表达式。考虑将 .php
添加到已知文件扩展名列表中,and/or 使用 END
标志 (Apache 2.4) 而不是 L
以防止重写引擎进一步循环。
不需要 QSA
标志,因为您没有在 substitution 字符串上附加查询字符串。默认传递查询字符串。
例如,改用以下内容:
RewriteRule !\.(png|jpe?g|gif|zip|css|svg|js)$ src/index.php [END]
我的文档根目录是 /var/www/html/
。
我在里面创建了一个名为myapi的目录,如/var/www/html/myapi
。
/var/www/html/myapi
中的文件夹结构类似于
.
|-- .htaccess
|-- composer.json
|-- composer.lock
|-- src
| |-- config
| |-- index.php
`-- vendor
我希望将所有请求(例如 http:localhost/myapi/books
重定向到 src 文件夹内的 index.php。
我当前的 .htaccess
设置:
RewriteEngine On
RewriteCond %{REQUEST_URI} !(\.png|\.jpg|\.gif|\.jpeg|\.zip|\.css|\.svg|\.js)$
RewriteRule (.*) src/index.php [QSA,L]
RewriteEngine 已经开启。 但是不行,服务器也没有响应。
我可以知道怎么做吗?
编辑:已修复。我搞砸了 docker 容器中 .htaccess 文件的一些卷挂载。
在 .htaccess 中使用以下代码。我希望它应该工作
RewriteEngine On
RewriteCond %{REQUEST_URI} !(\.png|\.jpg|\.gif|\.jpeg|\.zip|\.css|\.svg|\.js)$
RewriteRule (.*) src/index.php?page= [QSA,L]
RewriteCond %{REQUEST_URI} !(\.png|\.jpg|\.gif|\.jpeg|\.zip|\.css|\.svg|\.js)$ RewriteRule (.*) src/index.php [QSA,L]
...may I know how my .htaccess could be improved?
正如我在评论中提到的,这是“好的”,但可以改进。
此规则不必要地重写为自身。这里没有 rewrite-loop,因为您正在重写静态 file-path。 (但是在 substitution 字符串上包含一个斜杠前缀,你会得到一个 rewrite-loop - 500 内部服务器错误。)
没有必要捕获整个 URL-path(即 (.*)
),因为它没有被使用。
检查请求是否以已知文件扩展名结尾的条件可以移动到RewriteRule
模式. (不需要 RewriteCond
指令。)从正则表达式交替中删除点以“简化”正则表达式。考虑将 .php
添加到已知文件扩展名列表中,and/or 使用 END
标志 (Apache 2.4) 而不是 L
以防止重写引擎进一步循环。
不需要 QSA
标志,因为您没有在 substitution 字符串上附加查询字符串。默认传递查询字符串。
例如,改用以下内容:
RewriteRule !\.(png|jpe?g|gif|zip|css|svg|js)$ src/index.php [END]