A mod_rewrite availability check !

Как проверить, включен ли mod_rewrite на сервере?

В настоящее время я использую хостинг с сервером speedpeed . Хостинг говорит, что mod_rewrite включен, но я не могу заставить работать мой скрипт. Всякий раз, когда я пытаюсь получить доступ к URL-адресу, он возвращает 404 – не найденную страницу.

Я помещаю те же коды на другой сервер, который работает с Apache. Он работает там. Поэтому я предполагаю, что это проблема .htaccess и mod_rewrite .

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

Я пытался проверить с помощью phpinfo() , но не повезло, я не могу найти там mod_rewrite , потому что они используют lightspeed ?

Есть ли способ проверить? Пожалуйста, помогите мне. Спасибо.

FYI: мой код .htaccess

Options -Indexes DirectoryIndex index.php RewriteEngine on RewriteCond $1 !^(index\.php|assets|robots\.txt|favicon\.ico) RewriteCond % !-f RewriteCond % !-d RewriteRule ^(.*)$ ./index.php/$1 [L,QSA]  
DirectoryIndex index.php RewriteEngine on RewriteCond $1 !^(index\.php|assets|robots\.txt|favicon\.ico) RewriteCond % !-f RewriteCond % !-d RewriteRule ^(.*)$ ./index.php/$1 [L,QSA] 
  1. Чтобы проверить, включен ли модуль mod_rewrite, создайте новый php-файл в корневой папке вашего WAMP-сервера. Введите следующее phpinfo();
  2. Получите доступ к созданному файлу из своего браузера.
  3. Ctrl F, чтобы открыть поиск. Найдите ‘mod_rewrite’. Если он включен, вы видите его как «Загруженные модули»,
  4. Если нет, откройте httpd.conf (файл конфигурации Apache) и найдите следующую строку. #LoadModule rewrite_module modules/mod_rewrite.so
  5. Удалите знак фунта (‘#’) в начале и сохраните этот файл.
  6. Перезагрузите сервер Apache.
  7. Доступ к одному и тому же файлу php в вашем браузере.
  8. Ищите ‘mod_rewrite’ снова. Теперь вы сможете найти его.
Читайте также:  Add trusted certificates to java

Если вы используете файл конфигурации виртуальных хостов, убедитесь, что у виртуального хоста есть директива AllowOverride All где-то вроде этого:

из командной строки, введите

если режим перезаписи уже включен, он скажет вам об этом!

Если apache_get_modules () не распознан или нет информации об этом модуле в phpinfo (); попробуйте протестировать mod rewrite, добавив эти строки в ваш файл .htaccess:

RewriteEngine On RewriteRule ^.*$ mod_rewrite.php 
 . AllowOverride All  sudo a2enmod rewrite sudo service apache2 restart 
in_array('mod_rewrite', apache_get_modules()) 

возвращает true тогда mod-rewrite включен.

Если этот код находится в вашем файле .htaccess (без проверки на mod_rewrite.c)

DirectoryIndex index.php RewriteEngine on RewriteCond $1 !^(index\.php|assets|robots\.txt|favicon\.ico) RewriteCond % !-f RewriteCond % !-d RewriteRule ^(.*)$ ./index.php/$1 [L,QSA] 

и вы можете посетить любую страницу на своем сайте с получением ошибки 500 серверов. Я думаю, что можно с уверенностью сказать, что mod rewrite включен.

Переопределенная функция apache_get_modules() PHP возвращает список включенных модулей. Чтобы проверить, включен ли mod_rewrite , вы можете запустить следующий скрипт на своем сервере:

Если приведенный выше пример не удается, вы можете проверить mod-rewrite, используя файл .htaccess .

Создайте файл htaccess в корне документа и добавьте следующий rewriteRule:

RewriteEngine on RewriteRule ^helloWorld/?$ /index.php [NC,L] 

Теперь посетите http://example.com/HelloWorld , вы будете внутренне перенаправлены на страницу /index.php вашего сайта. В противном случае, если mod-rewrite отключен, вы получите 500 ошибок сервера Internel.

Вы можете использовать функцию php

и проверьте наличие mod_rewrite

Если вы находитесь в системе Linux, вы можете проверить все модули включения для apache2 (в моем случае) в следующей папке: / etc / apache2 / mods-available

cd /etc/apache2/mods-available 

для ввода: ll -a
если вы хотите проверить доступные модули для php (в данном случае php 7) папки /etc/php/7.0/mods-available

$ sudo httpd -M |grep rewrite_module 

Должен вывести rewrite_module (shared)

просто создайте новую страницу и добавьте этот код

  $res = 'Module Unavailable'; if(in_array('mod_rewrite',apache_get_modules())) $res = 'Module Available'; ?>   

mod_rewrite $res"; ?>

и запустите эту страницу, затем найдите, сможет ли модуль узнать, доступен ли он или нет, если нет, то вы можете спросить о своем хостинге или включить его на локальном компьютере, а затем пометьте этот шаг пошагового руководства, чтобы включить модуль перезаписи в wamp apache https://youtu.be/xIspOX9FuVU?t=1m43s Значок сервера Wamp -> Apache -> Модули Apache и проверьте параметр перезаписи

Источник

Модульное программирование на PHP или как написать маленький портал

Я попытаюсь тут разъяснить то, как я подхожу к написанию сайтов, где могут применять подключаемые модули. Пример тому известный скрипт PHPNuke. Как бы не ругали его, подход, примененный в нем, к модульному программированию очень удобен. Но из-за корявости общего кода применять такой скрипт на серьезных сайтах, точнее скажем порталах, с большим количеством посетителей, не рекомендуется. Почему? Скрипт работает медленно, очень большая нагрузка на базу данных. Можно еще очень много чего описать, но это уже материал для другой статьи. Если кому интересно , то в интернете полно описаний этого движка. В PHPNuke я убедился сам. Мой основной проект NVIDIA BIOS Collection в начала базировался на PHPNuke, но постоянные проблемы с хостингом заставили меня начать разработку своей система портала с нуля. Из PHPNuke я взять только суть модулей, все остальное же делал сам. И так для начала. Прежде всего, надо продумать систему каталогов, что и где будет лежать. Вот примерный вариант.

* /mods/ — каталог для хранения модулей
* /img/ — картинки
* /include/ — каталог вспомогательных файлов

Это что нам сейчас пока надо. Применять блоки и скины мы пока не будем. В моем портале также были другие каталоги

* /blocks/ — Тоже своего рода модули, но не выводящие сами информацию, а возвращающие заполненную переменную.
* /js/ — каталог для Java скриптов
* /theme/ — каталог выбора тем или, грубо говоря, набор скинов для сайта.
* /files/ — файлы для скачивания

В корневом каталоге храниться всего один файл index.php и вся работа идет через него. Теперь надо решить как будет выглядеть сам сайт. Для нашего примера подойдет наипростейший вариант дизайна , верх сайта , низ сайта, а в середине наша информация из модулей. Для этого в каталоге include создадим два файла top.php и bottom.php, что соответственно будет верхней частью дизайна и нижней частью дизайна.

        

здесь выводится шапка Меню сайта

- Модуль1
- Модуль2 "; ?>

Предвижу комментарии, где скажут, почему я не вывожу HTML код отдельно, а php отдельно. Я приучил себя к написанию 100% PHP кода, с одной стороны не очень и красиво может выглядеть, но мне так удобнее. Если кто-то хочет писать по-другому, то тут я не советчик. Заметьте переменную $PAGE_TITLE в top.php. В моей реализации вся информация о модулях храниться в базе данных, где помимо имени файла модуля храниться также и его название, которое потом и кладется в $PAGE_TITLE, для вывода его в головок браузера.

Также создадим файл конфигурации config.php и положим его в каталог include.

Вот примерная схема работы index.php

 $PAGE_TITLE="Модуль $mod"; include("inc/top.php"); include("inc/$mod.php"); include("inc/bottom.php"); ?>

Теперь создадим два файла mod1.php и mod2.php и положим их в каталог mods.

 echo "Это модуль номер 1!
"; echo "А здесь можно посмотреть на модуль номер 2"; ?> mod2.php echo "Это модуль номер 2!
"; echo "А здесь можно посмотреть на модуль номер 1"; ?>

Поясню немного вот эту строку

if (!eregi(«index.php», $PHP_SELF))

В каждый модуль желательно включать такую проверку во избежании вызова файла модуля вне самого index.php. На примере моего портала до вызова модуля у меня идет подключение в базе данных, считывание некоторых глобальных переменных и без них, ни один модуль сам по себе работать не сможет. Так что лучше всего просто запретить вызов модуля напрямую. Вызов модулей в данном случае производится через строку в виде index.php?mod=имя модуля, но тут можно применить и систему ЧПУ. Тогда URL примет вид index.php/имя модуля/

Вот в принципе очень грубая схема реализации модулей. Можно добавить любой модуль, просто положив его в каталог mods/ и придерживаясь общей концепции работы, построить очень сложный сайт. В чем удобства работы? По сути вы отодвигаете от себя основную заботу по натягиванию кода на дизайн. Это делает один раз в index.php. Сам же модуль должен только работать и приносить пользу. Централизация сбора основной информации из базы или конфигурационного файла, глобальные переменные сайта, информация о пользователе и т.д. С другой стороны есть недостатки (хотя при определенном взгляде они не кажутся недостатками), скажем надо четко следить за тем какие имена переменных используются до модуля, чтобы не перезаписать, случайно, их внутри модуля. Один раз у меня такое случилось. После такого случая, я взял для себя за правило называть системные переменные в таком виде $sys_имя переменной. Другой очевидный недостаток это трудность реализации разных вариантов дизайна для разных модулей. Но! Тут есть выход тоже.

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

К примеру, наши простые модули можно модифицировать в таком варианте.

 $PAGE_TITLE="Это Я, модуль номер 1. "; include("inc/top.php"); echo "Это модуль номер 1!
"; echo "А здесь можно посмотреть на модуль номер 2"; include("inc/bottom.php"); ?>

Как делать в данном и конкретном случае решать Вам. Я же просто попытался направить тех, кто начинает писать на php, а может и тех, кто уже пишет, на определенный вариант или стиль программирования.

Источник

Nginx serve plain file if exists else serve /index.php

This is as close as I can get, it serves any request for static files, and if it doesn’t exist, serves index.php as a plaintext file. How can I get index.php passed on to the PHP interpreter?

I only want plain files to be served by nginx, I don’t want any other php files to be served on their own. I want www.example.com/index.php to be served no matter what url is requested, except only if and only if there’s a static file that matches the url.

By «plain» files I mean static files like jpg and css. That was poor word choice on my part. @MichaelHampton I don’t really mind what happens when other php files are called anymore, whether they 404 or redirect to /index.php, I just want index.php to be executed when called so I can continue developing the site.

3 Answers 3

server < listen 80; listen [::]:80; root /home/www/example.com/htdocs; index index.php; server_name www.example.com; location ~* ^[^\?\&]+\.(html|jpg|jpeg|json|gif|png|ico|css|zip|tgz|gz|rar|bz2|doc|xls|pdf|ppt|txt|tar|mid|midi|wav|bmp|rtf|js|svg|woff|ttf)$ < # First attempt to serve request as file, then # as directory, then fall back to index.php try_files $uri $uri/ /index.php; #try_files /favicon.ico =404; >error_page 404 /index.php; location ~ \.php$ < add_header X-Is-PHP true; #try_files $uri =404; try_files /index.php =404; fastcgi_split_path_info ^(.+\.php)(/.+)$; # With php5-fpm: fastcgi_pass unix:/var/run/php5-fpm.sock; fastcgi_index index.php; include fastcgi.conf; >>

1) Added error_page 404 /index.php; so that all the requests not found on the server are redirected to index.php

2) Added «~ .php$» to location attribute.

3)If u want other PHP files to be interpreted as well, uncomment the line «#try_files $uri =404;» and comment the line «try_files /index.php =404;»

This got me slightly closer to what I want, now when I call another php file, it sends me back the source of /index.php. However, it still doesn’t execute /index.php at all.

Oh I feel like such an idiot. It’s been working this whole time but I’d been caught out by one shorttag in the /index.php file :/. I only noticed when I opened it up and realised the first php block wasn’t in the source I’d been getting in the browser.

my index file is not in root folder, it is located on modules/home/index.php. i try much settings but not work at all, i set it as ‘index /modules/home/index.php;’ but work

I tried adding this before, after and in the middle of my current location <> blocks but it had no effect. I tried using it instead of my first location block, but it was still exactly the same as before. I still get the source of /index.php sent to my browser unless there’s a static file at the requested url.

Because you need to remove all the content from your file regexp-location (the long one), and leave only break; inside it. Avoid using try_files , it’s largely misunderstood.

To be honest you should NOT be using If. This is even mentioned in the NGINX manual on their website. A great way to achieve serving a file if it exists is to use try_files properly. Here is in the example I have provided below.

set $base_root /webhosts/website.com/webroot; root $base_root; #if file exists then serve it. Else Fallback to @php location directive location / < try_files $uri $uri/ @php; >location @php < rewrite ^/(.+)$ /index.php?/$1 last; >

The example above is just using a re-write rule that I need. You should use try_files and let the 3rd argument (Fallback directive) determine what happens next.

Also make sure you set the root. If you set root to / then this is very dangerous because you open up the systems root to files you should not.

Источник

Оцените статью