Jump to content
Калькуляторы

Вопрос по апачевскому 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

 

Share this post


Link to post
Share on other sites

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

/tv24/auth?...

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

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

Share this post


Link to post
Share on other sites

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

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

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites

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

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

Ошибся.

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

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

 

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

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

Share this post


Link to post
Share on other sites

В 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

Share this post


Link to post
Share on other sites

В 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>

 

 

Share this post


Link to post
Share on other sites

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

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

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

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

Share this post


Link to post
Share on other sites

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

        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, этот ресурс я нигде не запрашиваю.

Share this post


Link to post
Share on other sites

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

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

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

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

 

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

Share this post


Link to post
Share on other sites

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

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

Share this post


Link to post
Share on other sites

Join the conversation

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

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.