Мод Rewrite - очистить URL с неработающей строкой запроса - PullRequest
1 голос
/ 12 апреля 2019

У меня есть следующий файл .htaccess.

<IfModule mod_rewrite.c> 
    Options +FollowSymlinks
    RewriteEngine On
    DirectoryIndex api.php
    FallbackResource index.php

    RewriteCond %{REQUEST_URI} ^/api
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{QUERY_STRING} ^$
    RewriteRule ^/([^/]+)/([^/]+)$ $1/$1.php?endpoint=$2 [L]
    RewriteRule ^([^/]+)/([^/]+)/([^/]+)$ $1/$1.php?endpoint=$2&id=$3 [L]
    RewriteRule ^([^/]+)/([^/]+)/([^/]+)/([^/]+)$ $1/$1.php?endpoint=$2&id=$3&endpoint2=$4 [L]
    RewriteCond %{QUERY_STRING} ^(.*)$
    RewriteRule ^([^/]+)$ $1/$1.php  [L]
    RewriteRule ^([^/]+)/([^/]+)? $1/$1.php?endpoint=$2%1 [QSA,L]
    RewriteRule ^/([^/]+)/([^/]+)/([^/]+)? $1/$1.php?endpoint=$2&id=$3%1 [QSA,L]
    RewriteRule ^([^/]+)/([^/]+)/([^/]+)/([^/]+)? $1/$1.php?endpoint=$2&id=$3&endpoint2=$4%1 [QSA,L]
</IfModule> 

Я хочу переписать конечные точки API (чистый формат URL с возможным запросом в конце последнего токена) в формат строки запроса полностью, как показано ниже.

Пример

api/users/123/actionitems

в настоящее время читает

api/api.php?endpoint=users&id=123&endpoint2=actionitems

{
    endpoint: users,
    id: 123,
    endpoint2: actionitems
}  

Но я тоже хочу конвертировать

api/users/123/actionitems?test=3

в

api/api.php?endpoint=users&id=123&endpoint2=actionitems&test=3

{
    endpoint: users,
    id: 123,
    endpoint2: actionitems,
    test: 3
}  

Это не работает. Я получаю только

api/api.php?endpoint=users&id=123&endpoint2=actionitems

когда я печатаю

/api/users/123/actionitems?test=3

{
    endpoint: users,
    id: 123,
    endpoint2: actionitems
}  

И только когда я набираю /api/users/123/actionitems&test=3 вместо знака вопроса (/api/users/123/actionitems?test=3) в моем запросе, это работает.

Как мне заставить это работать?

Ответы [ 2 ]

1 голос
/ 12 апреля 2019

Вы можете использовать следующее единственное правило:

    Options +FollowSymlinks
    RewriteEngine On
    DirectoryIndex api.php
    FallbackResource index.php
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteRule ^api/([^/]+)/([^/]+)/([^/]+)/?$  /api/api.php?endpoint=$1&id=$2&endpoint2=$3 [QSA,L]
0 голосов
/ 12 апреля 2019

Рабочее правило (пока ...)

<IfModule mod_rewrite.c> 
    Options +FollowSymlinks
    RewriteEngine On
    DirectoryIndex api.php
    FallbackResource index.php

    RewriteCond %{REQUEST_URI} ^/api
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond %{REQUEST_FILENAME} !-f

    RewriteCond %{QUERY_STRING} ^(.*)$
    RewriteRule ^api/$ /api/api.php? [L]
    RewriteRule ^api/([^/]+)/$ /api/api.php?endpoint=$1%1 [QSA,L]
    RewriteRule ^api/([^/]+)/([^/]+)$ /api/api.php?endpoint=$1&id=$2%1 [QSA,L]
    RewriteRule ^api/([^/]+)/([^/]+)/([^/]+)$  /api/api.php?endpoint=$1&id=$2&endpoint2=$3%1 [QSA,L]
    #Disgard tokens after 3rd token
    RewriteRule ^api/([^/]+)/([^/]+)/([^/]+)/(.*)$  /api/api.php?endpoint=$1&id=$2&endpoint2=$3%1 [QSA,L]
</IfModule>   
...