Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/277.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
mod_rewrite existing directories to index.php添加查询字符串,但对不存在的目录有效_Php_Apache_Mod Rewrite - Fatal编程技术网

mod_rewrite existing directories to index.php添加查询字符串,但对不存在的目录有效

mod_rewrite existing directories to index.php添加查询字符串,但对不存在的目录有效,php,apache,mod-rewrite,Php,Apache,Mod Rewrite,我的目录结构如下: vhostrootdir/ |- app/ |- public/ |- css/ |- img/ |- js/ 这是我的重写: ServerName vhostname <Directory "vhost/root/dir"> Options FollowSymLinks AllowOverride None Require local RewriteEngine On RewriteCond %{C

我的目录结构如下:

vhostrootdir/
|- app/
|- public/
   |- css/
   |- img/
   |- js/
这是我的重写:

ServerName vhostname
<Directory  "vhost/root/dir">
    Options FollowSymLinks
    AllowOverride None
    Require local

    RewriteEngine On
    RewriteCond %{CONTEXT_DOCUMENT_ROOT}/public/$1 -f
    RewriteRule ^((?s).*)$ public/$1 [END]
    RewriteRule ^((?s).*)$ index.php?_url=$1 [END]
</Directory>
ServerName vhostname
选项如下符号链接
不允许超限
要求本地
重新启动发动机
RewriteCond%{CONTEXT_DOCUMENT_ROOT}/public/$1-f
重写规则^((?s.*)$public/$1[结束]
重写规则^((?s.*)$index.php?\u url=$1[END]
如果我转到
vhostname/whatever
,那么我的php
$\u GET[“\u url”]
返回
whatever
,地址栏根据需要保持
vhostname/whatever

但是,如果我转到
vhostname/public
,那么
$\u GET[“\u url”]
就是
public/
。注意额外的“/”,尽管这并不困扰我问题是浏览器地址栏也会更改为
vhostname/public/?\u url=/public
,这是我绝对不想要的。

更让人困惑的是,如果我转到
vhostname/public/
(注意附加的“/”),那么它工作正常。我得到的
$\u得到的[“\u url”]
公共的/
,地址栏不变

如果我转到
vhostname/app
,情况也是一样的


编辑:发现这是一个浏览器历史问题。我清除了Chrome的历史记录并修复了它。没关系,那没办法。将DocumentRoot更改为公用文件夹后,它仍在公用和应用程序URL上发生,但清除历史记录后,它停止在公用和应用程序URL上发生,现在正在公用文件夹子文件夹上发生。

请注意,您希望将DocumentRoot指向public/因为应用程序/不应通过web访问

在本例中,设置空路径将导致_url==none,否则_url将包含添加的任何路径

ServerName vhostname
DocumentRoot /vhost/root/dir/public
<Directory "/vhost/root/dir/public">
    AllowOverride none
    Require local
    <IfModule mod_rewrite.c>
        RewriteEngine On
        RewriteBase /
        RewriteRule ^$ index.php?_url=none [NC,QSA,L]

        # we need to serve static files
        RewriteCond %{REQUEST_FILENAME} !-f
        RewriteCond %{REQUEST_FILENAME} !-d
        # pass the path to _url
        RewriteRule ^(.+)$ index.php?_url=$1 [NC,QSA,L]
    </IfModule>
ServerName vhostname
DocumentRoot/vhost/root/dir/public
不允许超限
要求本地
重新启动发动机
重写基/
重写规则^$index.php?\u url=none[NC,QSA,L]
#我们需要提供静态文件
重写cond%{REQUEST_FILENAME}-F
重写cond%{REQUEST_FILENAME}-D
#将路径传递到_url
重写规则^(+)$index.php?\u url=$1[NC,QSA,L]

好的,我相信我已经解决了这个问题。由于重写之前的URL解析为目录,并且我省略了尾随的
/
,apache自动发送301 Moved永久重定向,并添加了尾随的
/
。我猜,由于apache的工作顺序,重定向也会进行重写,而不是从
301重定向http:///img
/img/
是301重定向到
/img/?\u url=img


我最终解决了这个问题(我想),在vhost中添加了
directorysash off

结果发现这是某种浏览器历史记录问题,我的错。不过,我肯定会将DocumentRoot切换到公用文件夹,我早就应该这样做了。我没有
RewriteCond%{REQUEST\u FILENAME}-d
因为我不想提供目录服务,也不想给出一个403禁止。不管怎样,这都不能解决它。将DocumentRoot更改为公用文件夹后,它仍在公用和应用程序URL上发生,但清除历史记录后,它停止在公用文件夹子文件夹上发生,现在正在公用文件夹子文件夹上发生。是否重新启动Apache?删除-d后,我看不到浏览器地址栏发生更改。是的,每次更改vHost时我都重新启动Apache。如果我取出-d行,点击
清除浏览数据
按钮清除chrome历史记录,然后转到
http:///img
(无尾随/)或my DocumentRoot的任何其他子目录,然后地址栏更改为
/js/?\u url=js