Как скрыть "cgi-bin", ".py" и т.д. Из моих URL-адресов?

Совершенно новый для веб-дизайна, используя python. Запустил Apache и проверил python script, работающий в каталоге cgi-bin. Получите действительные результаты при явном в URL-адресе явно: ".../cgi-bin/showenv.py"

Но я не хочу, чтобы URL-адрес выглядел так. Здесь, например, в stackoverflow, URL-адреса, отображаемые в моей адресной строке, никогда не имеют беспорядочных подробностей, показывающих script, который использовался для их запуска. Они чисты от cgi-bin,.py и т.д. Расширений. Как это сделать?

EDIT: Спасибо за ответы, каждый полезный, много, чтобы учиться. На данный момент я перейду с URL Rewriting; пример в документах выглядит очень близко к тому, что я на самом деле хочу делать. Но я привержен python, так что вам придется смотреть на WSGI по дороге.

Ответ 1

Питовым способом написания веб-приложений не является cgi-bin. Именно с помощью WSGI.

WSGI - это стандартный интерфейс между веб-серверами и веб-приложениями Python или фреймворками. Этот параметр PEP 0333 определяет его.

Нет недостатков в использовании его вместо CGI. И вы получите много. Красивые URL-адреса - это лишь одна из опрятных вещей, которые вы можете легко сделать.

Кроме того, запись приложения WSGI означает, что вы можете развернуть его на любом веб-сервере, поддерживающем интерфейс WSGI. Apache делает это, используя mod_wsgi.

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

WSGIScriptAlias /myapp /usr/local/www/wsgi-scripts/myapp.py

Затем все запросы на http://myserver.domain/myapp перейдут на myapp.py application вызываемые, включая http://myserver.domain/myapp/something/here.

example myapp.py:

def application(environ, start_response):
    start_response('200 OK', [('Content-type', 'text/plain')])
    return ['Hello World!']

Ответ 2

Я думаю, вы можете это сделать, переписав URL-адрес через конфигурацию Apache. Вы можете увидеть документацию Apache для перезаписи здесь.

Ответ 3

Вам нужно использовать перезапись URL.

Это не вопрос о нобе, это может быть довольно сложно:)

http://httpd.apache.org/docs/2.0/misc/rewriteguide.html

Надеемся, что вы сочтете это полезным

Ответ 4

Просто используйте некоторые хорошие веб-рамки, например. django, и вы можете иметь такие URL-адреса больше, чем URL-адреса, у вас будет лучшая инфраструктура, шаблоны, db orm и т.д.

Ответ 5

это выдержка из .htaccess, которую я использую для достижения такой цели, например, перенаправляет все запросы, не относящиеся к index.php, к этому файлу, конечно же, вам нужно проверить серверные переменные в пределах файл, на который вы перенаправляетесь, чтобы видеть, что было запрошено.

Или вы просто создаете правило перезаписи, где вы используете RegExp, например ^.*\/cgi-bin\/.*\.py$, чтобы определить, когда и что переписать. Такой RegExp должен быть обработан очень осторожно, так что переписывание происходит только по желанию.

<IfModule mod_rewrite.c>
    RewriteEngine On   #activate rewriting
    RewriteBase /      #url base for rewriting
    RewriteCond %{REQUEST_FILENAME} !index.php #requested file is not index.php
    RewriteCond %{REQUEST_FILENAME} !^.*\.gif$ #requested file is no .gif
    RewriteCond %{REQUEST_FILENAME} !^.*\.jpg$ #requested file is no .jpg
    RewriteCond %{REQUEST_FILENAME} !-d        #is not a directory
    RewriteRule . /index.php [L]               #send it all to index.php
</IfModule>

В приведенном выше примере используются RewriteCond itions, чтобы определить, когда переписывать (.gif,.jpeg и index.php исключены).

Хмм, так вот длинный текст. Надеюсь, это было немного полезно, но вы не сможете избежать изучения синтаксиса Apache RewriteEngine.

Ответ 6

Вы найдете директиву ScriptAlias полезной. Использование

ScriptAlias /urlpath /your/cgi-bin/script.py

вы можете получить доступ к script через http://yourserver/urlpath.

Вы также можете посмотреть mod_passenger, хотя в последний раз, когда я его использовал, WSGI был своего рода "класс гражданина" в библиотеке - он может обнаруживать сценарии WSGI, если он используется для обслуживания всего домена, но в противном случае нет никаких директив, чтобы заставить его запускать приложение WSGI.