Перейти к содержимому
Калькуляторы

Вопрос по апачевскому rewrite

Снова rewrite работает по неясным правилам.

Не подскажите, что не так?

 

Нужно запросы вида .../tv24/auth?... передавать в скрипт /tv24.php.

Есть такой набор правил в htaccess:

        RewriteCond %{REQUEST_URI} ^/api/.*$
        RewriteRule ^api/v([0-9]+)/(.*)$ /api_v$1.php/$2 [L]
        RewriteCond %{REQUEST_URI} ^/bitrix24/
        RewriteRule ^bitrix24/(.*)$ /bitrix24.php/$1 [L]
        RewriteCond %{REQUEST_URI} ^/tv24/
        RewriteRule ^tv24/(.*)$ /tv24.php/$1 [L]
        RewriteCond %{REQUEST_FILENAME} !-f
        RewriteCond %{REQUEST_FILENAME} !-d
        RewriteRule ^(.*)$ index.php [L]

(в них еще парочка подобных переадресаций).

Вроде бы все правильно.

Онлайн-отладка тоже показывает, что все правильно.

Но на запрос получаю ошибку 404.

В логе rewrite.log такое:

(3) [perdir /data/sites/portal_api/www/] add path info postfix: /data/sites/portal_api/www/tv24.php -> /data/sites/portal_api/www/tv24.php/auth
(3) [perdir /data/sites/portal_api/www/] strip per-dir prefix: /data/sites/portal_api/www/tv24.php/auth -> tv24.php/auth
(3) [perdir /data/sites/portal_api/www/] applying pattern '^api/v([0-9]+)/(.*)$' to uri 'tv24.php/auth'
(3) [perdir /data/sites/portal_api/www/] add path info postfix: /data/sites/portal_api/www/tv24.php -> /data/sites/portal_api/www/tv24.php/auth
(3) [perdir /data/sites/portal_api/www/] strip per-dir prefix: /data/sites/portal_api/www/tv24.php/auth -> tv24.php/auth
(3) [perdir /data/sites/portal_api/www/] applying pattern '^bitrix24/(.*)$' to uri 'tv24.php/auth'
(3) [perdir /data/sites/portal_api/www/] add path info postfix: /data/sites/portal_api/www/tv24.php -> /data/sites/portal_api/www/tv24.php/auth
(3) [perdir /data/sites/portal_api/www/] strip per-dir prefix: /data/sites/portal_api/www/tv24.php/auth -> tv24.php/auth
(3) [perdir /data/sites/portal_api/www/] applying pattern '^tv24/(.*)$' to uri 'tv24.php/auth'
(3) [perdir /data/sites/portal_api/www/] add path info postfix: /data/sites/portal_api/www/tv24.php -> /data/sites/portal_api/www/tv24.php/auth
(3) [perdir /data/sites/portal_api/www/] strip per-dir prefix: /data/sites/portal_api/www/tv24.php/auth -> tv24.php/auth
(3) [perdir /data/sites/portal_api/www/] applying pattern '^(.*)$' to uri 'tv24.php/auth'
(4) [perdir /data/sites/portal_api/www/] RewriteCond: input='/data/sites/portal_api/www/tv24.php' pattern='!-f' => not-matched
(1) [perdir /data/sites/portal_api/www/] pass through /data/sites/portal_api/www/tv24.php

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

В 29.07.2022 в 14:33, alibek сказал:

/tv24/auth?...

прямо так с знаком вопроса, без вопроса тоже ошибка?

виртуальный хостинг, поэтому никак без апача?

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Без вопроса тоже ошибка 404.

Без апача никак, потому что сервер старый, на нем много всего и переносить это все довольно проблемно.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Причем предыдущий набор правил (с bitrix24) работает.

А с tv24 не работает, хотя такой же.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

404 - слишком просто, или нету, или не там лежит, или прав не хватает...

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

В 29.07.2022 в 17:02, alibek сказал:

Причем предыдущий набор правил (с bitrix24) работает.

Ошибся.

Точно так же не работает.

Тогда так и не разобрался с причиной, указывал прямой путь к скрипту.

 

Но первое правило с api работает корректно.

А оно ничем принципиально не отличается.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

В 29.07.2022 в 17:51, alibek сказал:

Но первое правило с api работает корректно.

В конфиге есть <Location> или <LocationMatch> на него?

 

В 29.07.2022 в 10:33, alibek сказал:
(3) [perdir /data/sites/portal_api/www/] add path info postfix: /data/sites/portal_api/www/tv24.php -> /data/sites/portal_api/www/tv24.php/auth

Обратите внимание, в самом начале лога адрес уже tv24.php, так что ваши реврайты не срабатывают. Возможно даже, что скрипт всё же вызывается без ожидаемого им аргумента и возвращает 404

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

В 29.07.2022 в 18:05, ixi сказал:

В конфиге есть <Location> или <LocationMatch> на него?

Нет.

 

В 29.07.2022 в 18:05, ixi сказал:

Обратите внимание, в самом начале лога адрес уже tv24.php

Видел, но не понял, откуда ".php" взялся.

Проверял через wget: wget -o - "http://....ru/tv24/auth"

В ответ получаю 404, в логах сервера то, что выкладывал выше.

 

В конфиге единственное место, где указан "tv24.php" — это правило RewriteRule.

Но это правило не срабатывает, иначе бы не было 404.

 

Весь конфиг в спойлере.

Скрытый текст
<VirtualHost *:80>
    ServerAdmin webmaster@server.local
    DocumentRoot "${APACHE_VHOST_DIR}/portal_api/www"
    <Directory "${APACHE_VHOST_DIR}/portal_api/www">
        Options +FollowSymLinks -Indexes
        IndexIgnore */*
        Order deny,allow
        Allow from all
        AllowOverride None
        RewriteEngine On
        RewriteCond %{REQUEST_URI} ^/api/.*$
        RewriteRule ^api/v([0-9]+)/(.*)$ /api_v$1.php/$2 [L]
        RewriteCond %{REQUEST_URI} ^/bitrix24/
        RewriteRule ^bitrix24/(.*)$ /bitrix24.php/$1 [L]
        RewriteCond %{REQUEST_URI} ^/tv24/
        RewriteRule ^tv24/(.*)$ /tv24.php/$1 [L]
        RewriteCond %{REQUEST_FILENAME} !-f
        RewriteCond %{REQUEST_FILENAME} !-d
        RewriteRule ^(.*)$ index.php [L]
    </Directory>
    ServerName server.ru
    DirectoryIndex index.php
    <Location /bitrix24/>
        Allow from **.**.**.68
        ...
        Deny from all
    </Location>
    <Location /sms.php>
        Allow from **.**.**.80
        ...
        Deny from all
    </Location>
    <Location /telegram.php>
        Allow from **.**.**.80
        ...
        Deny from all
    </Location>
    #RewriteLog "${APACHE_VHOST_DIR}/portal_api/log/rewrite.log"
    #RewriteLogLevel 8
    LogLevel notice
    ErrorLog  "${APACHE_VHOST_DIR}/portal_api/log/error.log"
    #SetEnv flag-debug
    #SetEnvIf Remote_Addr "0.0.0.0" flag-debug
    LogFormat "[%{%F %T}t %{%z}t] %h #%>s %O \"%{Referer}i\" -> \"%r\" \"%{User-Agent}i\" %Dus" details
    LogFormat "* %{%FT%T}t%{%z}t %Dus %h %H %f\n\t%m %U%q (len %I, \"%{Accept}i\")\n\tHost: %{Host}i\n\tReferer: %{Referer}i\n\tUA: %{User-Agent}i\n\tResponse: %X #%>s (len %O, \"%{Content-Type}o\")\n" debug
    CustomLog "${APACHE_VHOST_DIR}/portal_api/log/access.log" common
    #CustomLog "${APACHE_VHOST_DIR}/portal_api/log/details.log" details
    #CustomLog "${APACHE_VHOST_DIR}/portal_api/log/debug.log" debug env=flag-debug
</VirtualHost>

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

В 29.07.2022 в 18:05, ixi сказал:

Возможно даже, что скрипт всё же вызывается без ожидаемого им аргумента и возвращает 404

Нет, в нем такая ошибка не предусмотрена, он может возвращать только 400/401/403.

Так что 404 возвращает веб-сервер, а не скрипт.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Записал правила так:

        RewriteCond %{REQUEST_URI} ^/tv24(\.php)?/
        RewriteRule ^tv24(\.php)?/(.*)$ /tv24.php?$2 [L]

И через wget попробовал загрузить /tv24.php/auth и /tv24/auth .

В первом случае скрипт выполнился, во втором 404.

 

В логах в первом случае:

[rid#7fec5c27b0a0/initial] (3) [perdir /data/sites/portal_api/www/] add path info postfix: /data/sites/portal_api/www/tv24.php -> /data/sites/portal_api/www/tv24.php/auth
[rid#7fec5c27b0a0/initial] (3) [perdir /data/sites/portal_api/www/] strip per-dir prefix: /data/sites/portal_api/www/tv24.php/auth -> tv24.php/auth
[rid#7fec5c27b0a0/initial] (3) [perdir /data/sites/portal_api/www/] applying pattern '^api/v([0-9]+)/(.*)$' to uri 'tv24.php/auth'
[rid#7fec5c27b0a0/initial] (3) [perdir /data/sites/portal_api/www/] add path info postfix: /data/sites/portal_api/www/tv24.php -> /data/sites/portal_api/www/tv24.php/auth
[rid#7fec5c27b0a0/initial] (3) [perdir /data/sites/portal_api/www/] strip per-dir prefix: /data/sites/portal_api/www/tv24.php/auth -> tv24.php/auth
[rid#7fec5c27b0a0/initial] (3) [perdir /data/sites/portal_api/www/] applying pattern '^bitrix24/(.*)$' to uri 'tv24.php/auth'
[rid#7fec5c27b0a0/initial] (3) [perdir /data/sites/portal_api/www/] add path info postfix: /data/sites/portal_api/www/tv24.php -> /data/sites/portal_api/www/tv24.php/auth
[rid#7fec5c27b0a0/initial] (3) [perdir /data/sites/portal_api/www/] strip per-dir prefix: /data/sites/portal_api/www/tv24.php/auth -> tv24.php/auth
[rid#7fec5c27b0a0/initial] (3) [perdir /data/sites/portal_api/www/] applying pattern '^tv24(\\.php)?/(.*)$' to uri 'tv24.php/auth'
[rid#7fec5c27b0a0/initial] (4) [perdir /data/sites/portal_api/www/] RewriteCond: input='/tv24.php/auth' pattern='^/tv24(\\.php)?/' => matched
[rid#7fec5c27b0a0/initial] (2) [perdir /data/sites/portal_api/www/] rewrite 'tv24.php/auth' -> '/tv24.php?auth'
[rid#7fec5c27b0a0/initial] (3) split uri=/tv24.php?auth -> uri=/tv24.php, args=auth
[rid#7fec5c27b0a0/initial] (1) [perdir /data/sites/portal_api/www/] internal redirect with /tv24.php [INTERNAL REDIRECT]
[rid#7fec5c282410/initial/redir#1] (3) [perdir /data/sites/portal_api/www/] strip per-dir prefix: /data/sites/portal_api/www/tv24.php -> tv24.php
[rid#7fec5c282410/initial/redir#1] (3) [perdir /data/sites/portal_api/www/] applying pattern '^api/v([0-9]+)/(.*)$' to uri 'tv24.php'
[rid#7fec5c282410/initial/redir#1] (3) [perdir /data/sites/portal_api/www/] strip per-dir prefix: /data/sites/portal_api/www/tv24.php -> tv24.php
[rid#7fec5c282410/initial/redir#1] (3) [perdir /data/sites/portal_api/www/] applying pattern '^bitrix24/(.*)$' to uri 'tv24.php'
[rid#7fec5c282410/initial/redir#1] (3) [perdir /data/sites/portal_api/www/] strip per-dir prefix: /data/sites/portal_api/www/tv24.php -> tv24.php
[rid#7fec5c282410/initial/redir#1] (3) [perdir /data/sites/portal_api/www/] applying pattern '^tv24(\\.php)?/(.*)$' to uri 'tv24.php'
[rid#7fec5c282410/initial/redir#1] (3) [perdir /data/sites/portal_api/www/] strip per-dir prefix: /data/sites/portal_api/www/tv24.php -> tv24.php
[rid#7fec5c282410/initial/redir#1] (3) [perdir /data/sites/portal_api/www/] applying pattern '^(.*)$' to uri 'tv24.php'
[rid#7fec5c282410/initial/redir#1] (4) [perdir /data/sites/portal_api/www/] RewriteCond: input='/data/sites/portal_api/www/tv24.php' pattern='!-f' => not-matched
[rid#7fec5c282410/initial/redir#1] (1) [perdir /data/sites/portal_api/www/] pass through /data/sites/portal_api/www/tv24.php

[rid#7fec5c2790a0/subreq] (3) [perdir /data/sites/portal_api/www/] add path info postfix: /data/sites/portal_api/www/tv24.php -> /data/sites/portal_api/www/tv24.php/auth
[rid#7fec5c2790a0/subreq] (3) [perdir /data/sites/portal_api/www/] strip per-dir prefix: /data/sites/portal_api/www/tv24.php/auth -> tv24.php/auth
[rid#7fec5c2790a0/subreq] (3) [perdir /data/sites/portal_api/www/] applying pattern '^api/v([0-9]+)/(.*)$' to uri 'tv24.php/auth'
[rid#7fec5c2790a0/subreq] (3) [perdir /data/sites/portal_api/www/] add path info postfix: /data/sites/portal_api/www/tv24.php -> /data/sites/portal_api/www/tv24.php/auth
[rid#7fec5c2790a0/subreq] (3) [perdir /data/sites/portal_api/www/] strip per-dir prefix: /data/sites/portal_api/www/tv24.php/auth -> tv24.php/auth
[rid#7fec5c2790a0/subreq] (3) [perdir /data/sites/portal_api/www/] applying pattern '^bitrix24/(.*)$' to uri 'tv24.php/auth'
[rid#7fec5c2790a0/subreq] (3) [perdir /data/sites/portal_api/www/] add path info postfix: /data/sites/portal_api/www/tv24.php -> /data/sites/portal_api/www/tv24.php/auth
[rid#7fec5c2790a0/subreq] (3) [perdir /data/sites/portal_api/www/] strip per-dir prefix: /data/sites/portal_api/www/tv24.php/auth -> tv24.php/auth
[rid#7fec5c2790a0/subreq] (3) [perdir /data/sites/portal_api/www/] applying pattern '^tv24(\\.php)?/(.*)$' to uri 'tv24.php/auth'
[rid#7fec5c2790a0/subreq] (4) [perdir /data/sites/portal_api/www/] RewriteCond: input='/tv24.php/auth' pattern='^/tv24(\\.php)?/' => matched
[rid#7fec5c2790a0/subreq] (2) [perdir /data/sites/portal_api/www/] rewrite 'tv24.php/auth' -> '/tv24.php?auth'
[rid#7fec5c2790a0/subreq] (3) split uri=/tv24.php?auth -> uri=/tv24.php, args=auth
[rid#7fec5c2790a0/subreq] (1) [perdir /data/sites/portal_api/www/] internal redirect with /tv24.php [INTERNAL REDIRECT]

Во втором случае:

[rid#7fec5c27f0a0/subreq] (3) [perdir /data/sites/portal_api/www/] add path info postfix: /data/sites/portal_api/www/tv24.php -> /data/sites/portal_api/www/tv24.php/auth
[rid#7fec5c27f0a0/subreq] (3) [perdir /data/sites/portal_api/www/] strip per-dir prefix: /data/sites/portal_api/www/tv24.php/auth -> tv24.php/auth
[rid#7fec5c27f0a0/subreq] (3) [perdir /data/sites/portal_api/www/] applying pattern '^api/v([0-9]+)/(.*)$' to uri 'tv24.php/auth'
[rid#7fec5c27f0a0/subreq] (3) [perdir /data/sites/portal_api/www/] add path info postfix: /data/sites/portal_api/www/tv24.php -> /data/sites/portal_api/www/tv24.php/auth
[rid#7fec5c27f0a0/subreq] (3) [perdir /data/sites/portal_api/www/] strip per-dir prefix: /data/sites/portal_api/www/tv24.php/auth -> tv24.php/auth
[rid#7fec5c27f0a0/subreq] (3) [perdir /data/sites/portal_api/www/] applying pattern '^bitrix24/(.*)$' to uri 'tv24.php/auth'
[rid#7fec5c27f0a0/subreq] (3) [perdir /data/sites/portal_api/www/] add path info postfix: /data/sites/portal_api/www/tv24.php -> /data/sites/portal_api/www/tv24.php/auth
[rid#7fec5c27f0a0/subreq] (3) [perdir /data/sites/portal_api/www/] strip per-dir prefix: /data/sites/portal_api/www/tv24.php/auth -> tv24.php/auth
[rid#7fec5c27f0a0/subreq] (3) [perdir /data/sites/portal_api/www/] applying pattern '^tv24(\\.php)?/(.*)$' to uri 'tv24.php/auth'
[rid#7fec5c27f0a0/subreq] (4) [perdir /data/sites/portal_api/www/] RewriteCond: input='/tv24.php/auth' pattern='^/tv24(\\.php)?/' => matched
[rid#7fec5c27f0a0/subreq] (2) [perdir /data/sites/portal_api/www/] rewrite 'tv24.php/auth' -> '/tv24.php?auth'
[rid#7fec5c27f0a0/subreq] (3) split uri=/tv24.php?auth -> uri=/tv24.php, args=auth
[rid#7fec5c27f0a0/subreq] (1) [perdir /data/sites/portal_api/www/] internal redirect with /tv24.php [INTERNAL REDIRECT]

Понятия не имею, откуда он во втором случае берет tv24.php, этот ресурс я нигде не запрашиваю.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

В 29.07.2022 в 19:37, alibek сказал:

В конфиге единственное место, где указан "tv24.php" — это правило RewriteRule.

А что-нибудь глобальное вне VirtualHost или в .htaccess? раньше было популярно что-то вроде

RewriteCond %{REQUEST_FILENAME}.php -f
RewriteRule ^(.*)$ $1.php

 

Кстати, можно попробовать [L] на [END] поменять, от множества повторов.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Глобальных правил нет.

Подозреваю, что может быть у меня старый апач (2.2.22) и не понимает макрос REQUEST_FILENAME.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

В 01.08.2022 в 12:45, alibek сказал:

2.2.22

Тогда про Options -MultiViews не забывайте

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Гость
Ответить в тему...

×   Вставлено в виде отформатированного текста.   Вставить в виде обычного текста

  Разрешено не более 75 смайлов.

×   Ваша ссылка была автоматически встроена.   Отобразить как ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставить изображения напрямую. Загрузите или вставьте изображения по ссылке.