Как обрабатывать или преобразовывать // в / в адрес URL в python django и apache - linux - PullRequest
1 голос
/ 09 мая 2020

Сначала спасибо, что прочитали: X

Проблема + Описание:

Я перенаправляю http-трафик c с любого IP-адреса на порт 80 на 10.0.0.1:8080 (django) через linux apache и iptables.

Когда веб-пользователь отправляет запрос по этому URL-адресу (hello.gggstati c .com / generate_204 ******), я обрабатывать путь к **generate_204** URL-адресу, используя это правило: re_path('.*generate_204.*', lambda r: HttpResponseRedirect('splash/')),.

 Buuuuut, users are seeing `//splash/` instead of `/splash/` in browser.
`http://10.0.0.1:8080//splash/`  #django 404 not found
 users must see:    
`http://10.0.0.1:8080/splash/`   #django can handle it and via "include('splash.urls')"

Проблема: Как управлять / удалять / обрабатывать "//" в адресной строке URL-адреса! ! ??

Журнал:

[09/May/2020 13:43:36] "GET //generate_204 HTTP/1.1" 302 0
Not Found: //splash/
[09/May/2020 13:43:36] "GET //splash/ HTTP/1.1" 404 2328

мой файл urls.py в django -проекте:

urlpatterns = [
    re_path('/static/', serve,{'document_root': settings.STATICFILES_DIRS}), 
    re_path('.*generate_204.*', lambda r: HttpResponseRedirect('splash/')),
    path('', lambda r: HttpResponseRedirect('splash/')),
    #path('admin/', admin.site.urls),
    path('splash/', include('splash.urls')),
]

мои URL-адреса. py файл в django -приложении:

urlpatterns = [
    re_path('^$', views.start, name='start'),
    re_path('index/$', views.start, name='start'),
    path('validation', views.validation, name='validation'),
    path('bye', views.goodbye, name='goodbye'),
]

Я отредактировал свой вопрос:

path('splash/', include('splash.urls')),
#above line failed to handle //splash behavior.
to:
re_path('.*splash/', include('splash.urls')),  
#above line works. but it's not ok. and we can have everything here between ip/domin:8080 and /splash: http://10.0.0.1/******/splash/. and this behavior is bad for url handling.

1 Ответ

0 голосов
/ 10 мая 2020

Вы можете реализовать настраиваемое промежуточное ПО и настроить его как Djangos CommonMiddleware .

CommonMiddleware обрабатывает перенаправления для настроек PREPEND_WWW и APPEND_SLASH.

Таким образом, это более или менее такое же использование, как вы этого хотите: вы получаете запрос с определенным c URL-адресом и хотите перенаправить его на другой (или, другими словами: исправить URL-адрес ).

Итак, короткий (фиктивный) пример с небольшим кодом из указанного промежуточного программного обеспечения:

class RedirectDoubleSlashMiddleware(MiddlewareMixin):

    response_redirect_class = HttpResponsePermanentRedirect

    def process_request(self, request):

        uri = request.build_absolute_uri().replace('http://', '').replace('https://', '')

        possible_uri = uri.replace('//', '/')

        if uri != possible_uri:
            return self.response_redirect_class('{}://{}'.format(request.scheme, possible_uri))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...