Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/292.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/apache/9.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时,WSGI错误地处理了别名目录中的PHP脚本_Php_Apache_Mod Rewrite_Mod Wsgi_Mod Alias - Fatal编程技术网

使用mod_rewrite时,WSGI错误地处理了别名目录中的PHP脚本

使用mod_rewrite时,WSGI错误地处理了别名目录中的PHP脚本,php,apache,mod-rewrite,mod-wsgi,mod-alias,Php,Apache,Mod Rewrite,Mod Wsgi,Mod Alias,全部。所以我运行的是Apache2.2。我有一个用于Django应用程序(通过mod_wsgi)的VirtualHost和一个位于子目录中的PHP应用程序。通常,这是没有问题的。您只需Alias/subdir/path/to/phpapp后跟WSGIScriptAlias//path/to/django.wsgi 但是,复杂的是,这个PHP应用程序使用mod_rewrite来实现“奇特的URL”,这意味着“/subdir/foo/bar”将被重写为类似“/subdir/index.PHP?pat

全部。所以我运行的是Apache2.2。我有一个用于Django应用程序(通过mod_wsgi)的VirtualHost和一个位于子目录中的PHP应用程序。通常,这是没有问题的。您只需
Alias/subdir/path/to/phpapp
后跟
WSGIScriptAlias//path/to/django.wsgi

但是,复杂的是,这个PHP应用程序使用mod_rewrite来实现“奇特的URL”,这意味着“/subdir/foo/bar”将被重写为类似“/subdir/index.PHP?path=foo/bar”的内容

以下是我的配置:

<VirtualHost *:80>
    ServerName [snip]

    <Directory />
        Options FollowSymLinks
        AllowOverride None
    </Directory>

    Alias /phpapp/ /home/ubuntu/phpapp/
    <Directory /home/ubuntu/phpapp>
        Order allow,deny
        Allow from all
        RewriteEngine on
        RewriteCond $1 !^(index\.php|img|bin)
        RewriteRule ^(.*)$ index.php?__dingo_page=$1 [PT]
    </Directory>

    WSGIDaemonProcess foo user=ubuntu
    WSGIProcessGroup foo

    WSGIScriptAlias / /home/ubuntu/djangoapp/apache/django.wsgi
    <Directory /home/ubuntu/djangoapp/apache>
        Order allow,deny
        Allow from all
    </Directory>
</VirtualHost>

服务器名[snip]
选项如下符号链接
不允许超限
别名/phpapp//home/ubuntu/phpapp/
命令允许,拒绝
通融
重新启动发动机
1美元^(索引\.php|img|bin)
重写规则^(.*)$index.php?\u dingo\u页面=$1[PT]
WSGIDaemonProcess foo user=ubuntu
WSGIProcessGroup foo
WSGIScriptAlias//home/ubuntu/djangoapp/apache/django.wsgi
命令允许,拒绝
通融
问题是,每当发生重写时(例如,我尝试转到/phpapp或/phpapp/foo),请求就会由WSGI处理,我会看到Django站点的404页面。如果地址通过(例如,我转到/phpapp/index.php),那么它由php处理并正常工作。我认为在我的重写规则中添加
[PT]
标志可能会解决这个问题,但它似乎对选择哪个处理程序没有任何影响。我还在php应用程序的目录部分中尝试了
SetHandler应用程序/x-httpd-php


我需要Django应用程序继续处理任何没有特别别名的URL。一定有办法做到这一点!谢谢。

使用/phpapp是行不通的,因为Alias指令在该路径上有一个尾随斜杠。使用:

Alias /phpapp /home/ubuntu/phpapp
根据权限,Alias指令应优先于子URL的WSGIScriptAlias

我建议您通过mod_rewrite启用日志记录,并验证URL的写入目的。只要重写后的URL仍然位于/phpapp之下,就可以了

另一种方法是不使用WSGIScriptAlias,而是在以下内容末尾使用该方案作为大纲:


这允许您进行设置,以便只有在无法映射静态资源(包括PHP)的情况下,Python web应用程序才会用作后备资源。

是的,我检查了mod_重写日志。删除两个尾部斜杠并没有什么区别。另外,我做了一个测试来确认这取决于是否发生内部重定向。我输入了
RewriteCond$1^foobar$
,现在我得到了正常的Apache404页面,除非我转到/foobar,在这种情况下,我从Django获得了一个页面。我将尝试使用你现在链接到的信息。哦,等等!我现在明白了,我只是误解了重写日志的工作方式。我的问题是缺少
RewriteBase/phpapp
。早些时候我尝试了这个方法,但是我给出了文件系统路径,这是错误的。