我有一个webproject保存在域“example.com”的“base”文件夹中,其中包含main.php和几个子文件夹。 下面代码的第二部分将所有请求(main.php本身和page404.php除外)重定向到此main.php并移交最初请求的网址在变量“path”。
此外,还有第一部分将baseurl页面的所有请求重定向到子文件夹“folder1”。
的最终要求www.example.com/somepage.php
将导致
example.com/main.php?path=www.example.com/的 folder1中 /somepage.php
(对其他子文件夹的请求只能重定向到main.php。所以www.example.com/somefolder/somepage.php
会导致example.com/main.php?path=www.example.com/somefolder/somepage.php
- 而不添加“folder1”。)
下面的代码实际上做了我想要的事情:
ErrorDocument 404 /page404.php
Options -Indexes
DirectoryIndex index.php
<IfModule mod_rewrite.c>
RewriteEngine on
#first part: redirect to folder1/
RewriteCond %{HTTP_HOST} ^(www.)?example.com$
RewriteCond %{REQUEST_URI} !^/*
RewriteCond %{REQUEST_URI} !^page404*
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ folder1/$1
RewriteCond %{HTTP_HOST} ^(www.)?example.com$
RewriteRule ^(/)?$ index.php
#second part: redirect to main.php
RewriteCond %{REQUEST_FILENAME} (.*)\.php [NC]
RewriteCond %{REQUEST_URI} !main\.php
RewriteCond %{REQUEST_URI} !page404\.php
RewriteRule ^([^?]*)$ /main.php?path=$1 [NC,L,QSA]
</IfModule>
但我有两个问题:
附带问题:我觉得实际重定向到“folder1”是复杂的方法(即使它有效),当我只想将“folder1”添加到路径变量中时调用基本文件夹的文件。你能告诉我更好的方法吗?
主要问题:我在localhost上有相同的项目,其中主文件夹名为“folder1”,其中包含文件夹“folder1”。因此 htttp://localhost/folder1/somepage.php 的请求将导致 htttp://localhost/folder1/main.php?path = htttp:// localhost / folder1 / folder1 /somepage.php (我用“htttp”替换“http”以避免SO的自动链接识别) - 我如何更改上面的代码才能拥有它在“localhost / folder1”场景中工作?
答案 0 :(得分:1)
这个东西可以简化:
ErrorDocument 404 /page404.php
Options -Indexes
DirectoryIndex index.php
RewriteEngine on
# ignore main.php, page404.php OR any files/directory for any rules below
RewriteCond %{REQUEST_URI} ^/(main|page404)\.php
RewriteRule ^ - [L]
#first part: /folder1/path
RewriteRule ^([^/]+?\.php)$ main.php?path=folder1/$1 [L,QSA]
#second part: rewrite to main.php
RewriteRule ^(.+?\.php)$ main.php?path=$1 [L,QSA]