AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / user-575534

DevelJoe's questions

Martin Hope
DevelJoe
Asked: 2023-08-04 17:14:01 +0800 CST

重写 Apache 条件不会阻止重写的应用

  • 7

我尝试仅允许请求标头/multi以Content-Type开头的传入请求multipart/form-data,而对其他POST、PUT或DELETE端点的请求必须始终具有application/json Content-Type.

在我的网络根文件中执行以下操作时.htaccess(无根访问权限):

# Enforce multipart/form-data content type for /multi routes
RewriteCond %{REQUEST_URI} ^/multi [NC]
RewriteCond %{HTTP:Content-Type} !^multipart/form-data; [NC]
RewriteRule ^ - [R=400,L,END]

# Enforce JSON content type for all other POST, PUT, and DELETE endpoints
RewriteCond %{REQUEST_METHOD} ^(POST|PUT|DELETE)$
RewriteCond %{HTTP:Content-Type} !^application/json [NC]
RewriteCond %{REQUEST_URI} !^/multi [NC]
RewriteRule ^ - [R=400,L,END]

...然后发送POST /multiwith Content-Type: multipart/form-data,我得到 Apache 的400 Bad Request响应。当我删除第二个重写块时,请求就会通过。为什么在发送POST /multiwith时应用第二个重写块Content-Type: multipart/form-data,尽管我有条件RewriteCond %{REQUEST_URI} !^/multi [NC],这应该阻止它被应用?

当我在启用第二个重写块的情况下发送请求时检查 apache 错误日志时,我根本没有错误日志。当我检查 Apache Dom 日志时,我只是收到了一个传入请求以/multi产生400响应。因此,似乎确实应用了第二个重写规则,这对我来说没有意义。

完整的 .htaccess 文件

# Prevent files whose name starts with ".ht" from frontend access
<FilesMatch "^\.ht">
    Require all denied
</FilesMatch>

# Set global Rules for document root directory
Options Indexes FollowSymLinks
Require all granted

# Specify rewrite rules
RewriteEngine On

# Authorization Header seems to be stripped by default, hence explicitly enable it
# Doing it via the rewrite rule is not the native way of doing it, and would need an improved rule to avoid that an
# Authorization HTTP header with an empty value is still passed to PHP
# RewriteCond %{HTTP:Authorization} ^(.*)
# RewriteRule .* - [e=HTTP_AUTHORIZATION:%1]
CGIPassAuth On

# Enforce multipart/form-data content type for /multi route
RewriteCond %{REQUEST_URI} ^/multi [NC]
RewriteCond %{HTTP:Content-Type} !^multipart/form-data; [NC]
RewriteRule ^ - [R=400,L,END]

# Enforce JSON content type for all other POST, PUT, and DELETE endpoints (return a 400 Bad Request otherwise)
RewriteCond %{REQUEST_METHOD} ^(POST|PUT|DELETE)$
RewriteCond %{HTTP:Content-Type} !^application/json [NC]
RewriteCond %{REQUEST_URI} !^/multi [NC]
RewriteRule ^ - [R=400,L,END]

# Route all incoming requests through index.php, except if it's for existing files
RewriteBase /
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule . /index.php [L]

# Ensure that png images, javascript and css files are all delivered with correct mime type. mod_mime must be enabled.
AddType application/javascript .js
AddType image/png .png
AddType text/css .css

# Add an 'Expires' HTTP header for all accessed js, css and png image files. mod_expires must be enabled.
ExpiresActive On
ExpiresByType image/png "access plus 1 year"
ExpiresByType application/javascript "access plus 1 year"
ExpiresByType text/css "access plus 1 year"

# Also add a Cache-Control HTTP header for the same cache lifetime of 1 year, to cover all browsers. mod_headers needed.
<FilesMatch "\.(js|css|png)$">
  Header set Cache-Control "public, max-age=31536000"
</FilesMatch>

# Define Image Uploads directory, to be able to access img uploads while uploads are kept outside from document root
RewriteRule ^images/(.*)$ /uploads/imgs/$1 [L]

# Ensure that all icons are delivered with the image/jpeg MIME type
RewriteRule ^icons/ - [E=CONTENT_TYPE:image/png]
apache-2.4
  • 1 个回答
  • 101 Views
Martin Hope
DevelJoe
Asked: 2023-06-19 21:01:19 +0800 CST

清除 PHP-Apache 服务器的 gettext 缓存以应用 .mo 更新

  • 5

虽然SO上的许多问题已经与此相关,但它们A)相当老了,B)我觉得最好在这里问这个问题,因为它似乎与某些服务器级别而不是编程级别的缓存有关。

问题是我们的服务器使用 Apache 和 PHP,gettext在本机配置中使用 .po 和 .mo 文件,即使用bindtextdomain文件夹结构:

translations/
    en_GB/
        LC_MESSAGES/
            mydomain.mo
    fr_FR/
        LC_MESSAGES/
            mydomain.mo

例如,加载mydomain文本域的英语和法语翻译。将翻译加载到服务器并首次使用 PHP 的本机gettext()、_()等功能可以正常工作,一切都很好。问题是,当我们用新翻译更新 .mo 文件时,这些更新不会应用。多个消息来源指出,必须重新启动 apache 服务器才能刷新 gettext 缓存:

  • 所以
  • GNU
  • 语言中心

ETC。

到目前为止,Apache-PHP 应用程序的 gettext 缓存是否仍然可以通过重新启动 apache 服务器来完全刷新?没有其他方法可以做到这一点吗?考虑到我们有一个托管的 VPS 托管,因此没有 root 访问权限,并且我们不允许在我们的服务器上重新启动 Apache。

我知道理论上您可以实现一个逻辑,将修改的时间戳添加到域名中mydomain,但根据此处的这篇文章,“更改域以消除缓存问题[...]将创建大量的out-of -内存中的日期缓存。”,所以我想知道这种方法是否真的可行。

PHP 在我们的 Apache 服务器上作为 php-cgi 运行。我现在还注意到,这些LC_MESSAGES文件夹包含一个.nfs....我似乎无法删除的文件(如果我删除它,它就会重新出现)。这是否表明我的.mo文件已被某些应用程序重新打开/访问,而不是关闭,从而导致某种不需要的翻译缓存?

apache-2.2
  • 1 个回答
  • 29 Views
Martin Hope
DevelJoe
Asked: 2022-11-12 01:58:52 +0800 CST

如何在 PHP Apache Docker 容器中正确设置作曲家

  • 5

我的 Dockerfile 的内容:

FROM php:8.1-apache

WORKDIR /var/www/html/

RUN pecl install xdebug \
    && docker-php-ext-enable xdebug \
    && a2enmod rewrite \
    && docker-php-ext-install zip

COPY --from=composer:latest /usr/bin/composer /usr/bin/composer
COPY composer.json composer.json
COPY composer.lock composer.lock

RUN groupadd -r user && useradd -r -g user user
USER user
RUN composer install --no-dev

COPY . .

EXPOSE 80

作曲家安装在它告诉我需要该libzip软件包的地方失败了。但是我找不到那个包裹,无论是通过pecl,还是通过apt-get; 正如大多数论坛帖子所指的那样。我如何安装libzip才能最终运行?

关于我的 Dockerfile 行的一些注释;如果我的设置有误,请随时纠正我;这是我第一次这样做:

COPY --from=composer:latest /usr/bin/composer /usr/bin/composer
COPY composer.json composer.json
COPY composer.lock composer.lock

据我了解,官方文档告诉您使用这种多阶段方法让作曲家以最佳方式在您的 PHP Docker 容器中运行。如果我理解正确的话,这样做可以让你分享你的图像,而不需要你的同事在本地安装作曲家/下载包;然后一切都将在容器内完成。这正是我要找的。

RUN groupadd -r user && useradd -r -g user user
USER user
RUN composer install --no-dev

我首先尝试简单地运行最后一行composer install --no-dev,这实际上是行不通的,因为容器不允许您执行根命令;由默认使用composer。因此采用此解决方法的原因(更改用户也是官方文档推荐的;根据上面的链接)。

&& docker-php-ext-install zip

当最终能够composer install在容器中运行命令时,它告诉我zip需要扩展;这就是我添加docker-php-ext-install zip命令的原因。libzip现在,由于最初提到的问题,我陷入困境。

如果您看到更好的设置作曲家的方法;我很高兴听到更好的方法。

php
  • 1 个回答
  • 119 Views
Martin Hope
DevelJoe
Asked: 2022-11-11 06:48:26 +0800 CST

无法让 Apache 重写以在 Docker PHP-Apache 容器上工作

  • 6

我已经按照本论坛中的很多说明、教程和问题进行操作,但我仍然无法正常工作。我已经使用 PHP Apache Docker 容器设置了一个 REST API,并且需要在我的 apache 配置中创建一个重写规则以将 API 请求重新路由到index.php(REST 控制器)。目前,根据下面的内容,我得到了 404:

本地机器上的文件结构(列出除 php 源代码之外的所有内容;此处不需要):

php
  conf.d
    - error_reporting.ini
    - xdebug.ini
  Dockerfile
  index.php

apache
  - apache2.conf

docker-compose.yml

Dockerfile 的内容是:

FROM php:8.1-apache

WORKDIR /var/www/html/

RUN pecl install xdebug \
    && docker-php-ext-enable xdebug \
    && a2enmod rewrite

COPY . .

EXPOSE 80

docker-compose.yml 的内容是:

services:

  php:
    build: ./php
    depends_on:
      - db
    container_name: php-apache
    ports:
      - 80:80
    volumes:
      - ./php:/var/www/html
      - ./php/conf.d/xdebug.ini:/usr/local/etc/php/conf.d/docker-php-ext-xdebug.ini
      - ./php/conf.d/error_reporting.ini:/usr/local/etc/php/conf.d/error_reporting.ini
      - ./apache/apache2.conf:/etc/apache2/apache2.conf
    environment:
      MARIADB_HOST: localhost
      MARIADB_USER: root
      MARIADB_PASSWORD: top_very_secret
      MARIADB_DB: apidb

  adminer:
    image: adminer
    depends_on:
      - db
    restart: always
    ports:
      - 8080:8080

  db:
    image: mariadb
    container_name: db
    volumes:
      - maria-db-storage:/var/lib/mysql
    environment:
      MARIADB_ROOT_PASSWORD: top_very_secret
      MARIADB_DATABASE: apidb

volumes:
  maria-db-storage:

关于apache2.conf;的内容 我已完成以下操作以在本地计算机上创建它:

  1. 使用 . 进入容器的虚拟文件系统docker exec -t -i <container_name> /bin/bash。
  2. 流浪到/etc/apache2
  3. 通过打印文件内容cat apache2.conf
  4. 将内容复制粘贴到我的本地/apache/apache2.conf文件中
  5. 在该本地文件的末尾添加了以下指令行:
# Custom directives start here

# Set Server's name
ServerName 'localhost'

# Rewrite for routing of all requests through REST controller
RewriteEngine On

# If requested resource is index.php, do nothing
RewriteRule ^index\.php$ - [L]

# If requested resource is a file or directory that does not exist, reroute to REST 
# controller index.php
RewriteCond %{DOCUMENT_ROOT}%{REQUEST_URI} !-f [OR]
RewriteCond %{DOCUMENT_ROOT}%{REQUEST_URI} !-d
RewriteRule . /index.php [L]

在构建镜像并运行容器后,我通过 CLI 再次检查了容器的虚拟文件系统。成功保存了我本地文件的/etc/apache2/apache2.conf内容,我也在apachectl -M容器内做了一个,可以看到rewrite_module (shared)打印出来了。

同样,我只是收到 404;例如,如果我搜索http://localhost/xyz. 如果我不省略端口(并搜索http://localhost:80/xyz),则相同。搜索http://localhost和http://localhost:80两者都有效;所以我的重写规则似乎根本没有被应用。

apachectl configtest在 docker 容器中运行时,我也会得到Syntax OK.

只是猜测;这可能与来自容器端口 9003 的 xdebugs 传出通信有关吗?

我错过了什么?

apache-2.4
  • 1 个回答
  • 192 Views
Martin Hope
DevelJoe
Asked: 2020-05-20 09:19:55 +0800 CST

在 Apache Web Server 前面配置 NGINX 反向代理(启用 websockets)

  • 0

根据 stackoverflow 论坛成员的推荐,我在此论坛中提出以下问题,它显然更适合(我是该论坛的新手)。

我到底想要什么:

我网站的特定页面应从 Web 服务器加载其内容(html 结构,表示聊天窗口),但其聊天功能,在服务器端(放置在同一 Web 服务器上)以 PHP Ratchet 脚本的形式显示,应该可以工作通过 WebSocket 连接。

换句话说,对于这个特定页面,Web 服务器和 WebSocket 连接应该同时工作,而我只有一个 Apache (2.4) 服务器,在共享主机的基础上,没有 root 访问权限。而且,如前所述,在 Ratchet 中编程的聊天应用程序和网站的 HTML 页面都存在于 Web 服务器上。

在我的本地主机上进行测试时,效果非常好。然而,当尝试在我的 Web 服务器上部署它时,我遇到了麻烦,并且似乎需要在我的 Web 服务器或类似服务器( http://socketo.me/docs/deploy)前面使用 NGINX 反向代理。考虑到我的托管条件,这甚至可以部署,还是我需要切换到另一种托管类型?我从配置 NGINX 开始,但问题是我实际上无法修改我的 Apache Web 服务器正在侦听的端口,因为我没有 root 访问权限。我觉得我需要为此切换我的托管类型?

这个问题的一个方面可以总结为:当在共享主机的基础上拥有一个没有 root 访问权限的 web 服务器时,是否可以在客户端和浏览器之间放置一个反向代理以用于 websocket 目的?

php nginx reverse-proxy websocket shared-hosting
  • 1 个回答
  • 202 Views

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    新安装后 postgres 的默认超级用户用户名/密码是什么?

    • 5 个回答
  • Marko Smith

    SFTP 使用什么端口?

    • 6 个回答
  • Marko Smith

    命令行列出 Windows Active Directory 组中的用户?

    • 9 个回答
  • Marko Smith

    什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同?

    • 3 个回答
  • Marko Smith

    如何确定bash变量是否为空?

    • 15 个回答
  • Martin Hope
    Tom Feiner 如何按大小对 du -h 输出进行排序 2009-02-26 05:42:42 +0800 CST
  • Martin Hope
    Noah Goodrich 什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同? 2009-05-19 18:24:42 +0800 CST
  • Martin Hope
    Brent 如何确定bash变量是否为空? 2009-05-13 09:54:48 +0800 CST
  • Martin Hope
    cletus 您如何找到在 Windows 中打开文件的进程? 2009-05-01 16:47:16 +0800 CST

热门标签

linux nginx windows networking ubuntu domain-name-system amazon-web-services active-directory apache-2.4 ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve