วิธีลบ“ index.php” ในเส้นทางของ codeigniter


116

ฉันจะลบสิ่งที่"index.php"ยื่นออกมาในทุกเส้นทางใน Codeigniter ที่ใดที่หนึ่งตรงกลางได้อย่างไร ฉันต้องการที่ไม่สะอาดindex.php-fied URLs?


คำตอบ:


90

หากคุณกำลังใช้ Apache ให้วางไฟล์. htaccess ในไดเรกทอรีเว็บรูทของคุณที่มีสิ่งต่อไปนี้:

RewriteEngine on
RewriteCond $1 !^(index\.php|[Javascript / CSS / Image root Folder name(s)]|robots\.txt)
RewriteRule ^(.*)$ /index.php/$1 [L]

อีกรุ่นที่ดีตั้งอยู่ที่นี่:

http://snipplr.com/view/5966/codeigniter-htaccess/


2
+1 สำหรับลิงค์! แม้ว่าจะต้องปรับแต่งเล็กน้อย ได้ด้วยสิ่งนี้ -> RewriteCond% {REQUEST_FILENAME}! -f RewriteCond% {REQUEST_FILENAME}! -d RewriteRule ^ (. *) $ index.php / $ 1 [QSA, L]
OrangeRind

ด้วยเหตุผลบางประการฉันต้องเพิ่มเครื่องหมายทับที่จุดเริ่มต้นของ RewriteCond RewriteCond $1 !^\/(index\.php|assets|robots\.txt)
Henry

ด้วยเหตุผลบางประการหากคุณมี index.php ใน URL มันจะไม่ถูกลบออกไปจริงๆมันจะอยู่ที่นั่นและทำงานต่อไป
CMCDragonkai

1
ฉันใช้ชุดค่าผสมที่เป็นไปได้ทั้งหมดแล้วก็ยังไม่ได้ผลสำหรับฉัน !!!!! คุณทำงานอย่างไร ??
Roshdy

ต้องกำหนดค่าการติดตั้ง Apache เพื่อตรวจสอบไฟล์. htaccess - ตรวจสอบให้แน่ใจว่าเป็นเช่นนั้น
Sean Vieira

60

ฉันมีปัญหาใหญ่บางอย่างกับการลบ index.php ตามกฎทั่วไป. htaccess ด้านล่างนี้ได้รับการทดสอบบนเซิร์ฟเวอร์หลายเครื่องและโดยทั่วไปใช้งานได้:

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php/$1 [L]  

<Files "index.php">
AcceptPathInfo On
</Files>  

หากคุณไม่มีโชคกับสิ่งนั้นขั้นตอนต่อไปคือการปรับไฟล์กำหนดค่าของคุณ ลองใช้โปรโตคอล URI อื่น ๆ เช่น

| 'AUTO'            Default - auto detects
| 'PATH_INFO'       Uses the PATH_INFO
| 'QUERY_STRING'    Uses the QUERY_STRING
| 'REQUEST_URI'     Uses the REQUEST_URI
| 'ORIG_PATH_INFO'  Uses the ORIG_PATH_INFO

   $config['uri_protocol']  = 'ORIG_PATH_INFO';

หากคุณยังไม่มีโชคให้ลองเปลี่ยนกฎการเขียนซ้ำเพื่อรวมโฟลเดอร์ย่อยของคุณ ปัญหานี้มักเป็นปัญหาหากคุณใช้ URL ชั่วคราวบนเซิร์ฟเวอร์ dev เป็นต้น:

RewriteRule ^(.*)$ /subofolder1/subfolder2/index.php/$1 [L]  

เพียงแค่ลองเล่นกับตัวเลือกเหล่านี้ก็น่าจะใช้ได้ ตรวจสอบให้แน่ใจว่าไฟล์ดัชนีของคุณถูกตั้งค่าเป็น:

$config['index_page'] = '';

โชคดี!


ฉันคิดว่ารหัสแรกของคุณที่นี่เป็นทางออกสำหรับฉัน แต่จริงๆแล้วมันเป็นเพียงการส่ง url ใด ๆ เช่น domain / * ไปยัง domain / index.php มันไม่ได้ส่งโดเมน / ยินดีต้อนรับสู่ตัวควบคุมการต้อนรับ รู้สึกตื่นเต้นเป็นครั้งที่สองแล้ว ลองทำตามคำแนะนำอื่น ๆ เลย
jsky

31

มีไฟล์. htaccess ในไดเร็กทอรี root ของแอ็พพลิเคชันพร้อมกับไฟล์ index.php (ตรวจสอบว่าส่วนขยาย htaccess ถูกต้อง Bz htaccess.txt ไม่ได้ผลสำหรับฉัน)

และเพิ่มกฎต่อไปนี้ในไฟล์. htaccess

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php/$1 [L]  

จากนั้นค้นหาบรรทัดต่อไปนี้ในไฟล์ application / config / config.php ของคุณ

$config['index_page'] = 'index.php';

ตั้งค่าตัวแปรว่างตามด้านล่าง

$config['index_page'] = '';

เพียงเท่านี้มันก็ได้ผลสำหรับฉัน

หากไม่ได้ผลต่อไปให้ลองแทนที่ตัวแปรต่อไปนี้ด้วยพารามิเตอร์เหล่านี้ ('AUTO', 'PATH_INFO', 'QUERY_STRING', 'REQUEST_URI' และ 'ORIG_PATH_INFO') ทีละรายการ

$config['uri_protocol'] = 'AUTO';

3
ขอบคุณฉันล้มเหลวในเรื่องนี้มานานแล้วไม่รู้ทำไม แต่วิธีของคุณทำงานเหมือนเนย: D
Ahmed Samy

1
ขอบคุณ MDeSilva โพสต์นี้ช่วยประหยัดเวลาของฉัน
sanji

1
ขอบคุณ มันใช้งานได้ BTW ฉันไม่จำเป็นต้องเปลี่ยน config.php
Stony

1
ขอบคุณคนนี้ช่วยฉันฉันใช้ PATH_INFO กับ WAMP
T.Coutlakis

21

ดูในsystem\application\config\config.phpไฟล์มีตัวแปรชื่อindex_page

ควรมีลักษณะดังนี้

$config['index_page'] = "index.php";

เปลี่ยนเป็น

$config['index_page'] = "";

ตามที่กล่าวไว้คุณต้องเพิ่มกฎการเขียนซ้ำลงใน.htaccessไฟล์

หมายเหตุ: ใน CodeIgniter v2 ไฟล์นี้ถูกย้ายออกจากโฟลเดอร์ระบบไปที่ application\config\config.php


9

วิธีการทั้งหมดข้างต้นล้มเหลวสำหรับฉันและจากนั้นฉันพบว่าฉันไม่ได้เปลี่ยนAllowOverride Noneเป็นAllowOverride Allในไฟล์โฮสต์เสมือนของฉันที่/ etc / apache2 / sites-available / default

<VirtualHost *:80>
    ServerAdmin webmaster@localhost

    DocumentRoot /var/www
    <Directory />
            Options FollowSymLinks
            AllowOverride All    <---- replace None with All
    </Directory>
    <Directory /var/www >
            Options Indexes FollowSymLinks MultiViews
            AllowOverride All   <---  replace None with All
            Order allow,deny
            allow from all
    </Directory>

     ...


ขอบคุณมากฉันได้รับ AllowOverride None แล้วตอนนี้ใช้งานได้แล้ว!
Willy

ตอนนี้บล็อกหายไปแล้วและฉันชอบอ่านมาก วิธีแก้ปัญหาเหล่านี้ไม่ได้ผลสำหรับฉัน ...
Kevin Beal

ยอดเยี่ยมช่วยวันของฉัน
JChow

6
RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule .* /codeigniter/index.php/$0 [PT,L]

หลังจากเปลี่ยน RewriteRule. * index.php / $ 0 [PT, L] ด้วยชื่อโฟลเดอร์โครงการ "codeigniter" มันทำงานให้ฉัน ขอบคุณสำหรับการสนับสนุนของคุณ


6

ขั้นตอนที่ 1 => วางไฟล์. htaccess ของคุณในโฟลเดอร์รูทที่มีแอพพลิเคชั่นและโฟลเดอร์ระบบ

ขั้นตอนที่ 2 => หากเส้นทางเว็บของคุณใช้โฟลเดอร์ย่อยเช่น - yourdomain.com/project/ - ให้ใช้รหัสต่อไปนี้ในไฟล์ htaccess

RewriteEngine on
RewriteBase    /project/
RewriteCond $1 !^(index\.php|images|robots\.txt)
RewriteRule ^(.*)$ /project/index.php/$1 [L]

หากเส้นทางเว็บของคุณใช้รูทโฟลเดอร์เช่น yourdomain.com ให้ใช้รหัสต่อไปนี้ในไฟล์ htaccess

RewriteEngine on
RewriteBase    /
RewriteCond $1 !^(index\.php|images|robots\.txt)
RewriteRule ^(.*)$ /index.php/$1 [L]

การพยายามใช้ตัวอย่างแรกข้างต้นใช้งานได้กับรูทของฉันเท่านั้น แต่ไม่ใช่ในการโหลดแบบฟอร์ม ฯลฯ จะยังคงพยายามใช้ index.php ใน url ฉันจะเล่นรอบ ๆ และกลับมาที่สิ่งนี้หากฉันสามารถแก้ไขได้
Sam

ขอบคุณ @ Vinod ฉันจะบ้ากับปัญหานี้ฉันค้นหาบนเน็ตมานานแล้วลองวิธีแก้ปัญหาต่างๆ แต่ก็ไม่เคยได้ผลจนกว่าฉันจะเจอวิธีแก้ปัญหาของคุณตอนนี้โครงการ CI ของฉันใช้งานได้และทำให้ฉันมีความหวังใหม่ เพื่อก้าวต่อไปกับ CI ขอบคุณมาก :)
gomesh munda

5

แค่คิดว่าฉันอาจจะเพิ่ม

RewriteEngine on
RewriteCond $1 !^(index\.php|resources|robots\.txt)
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php/$1 [L,QSA] 

จะเป็น. htaccess และอย่าลืมแก้ไขตัวแปร application / config.php ของคุณในลักษณะต่อไปนี้:

แทนที่

$config['uri_protocol'] = AUTO 

กับ

$config['uri_protocol'] = REQUEST_URI

5
RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule .* index.php/$0 [PT,L] 

อย่างนี้ต้องได้ผลแน่นอน.. ได้ลอง


4

ตรวจสอบให้แน่ใจว่าคุณได้เปิดใช้งานmod_rewrite(ฉันไม่มี)
การเปิดใช้งาน:

sudo a2enmod rewrite  

นอกจากนี้แทนที่AllowOverride Noneด้วยAllowOverride All

sudo gedit /etc/apache2/sites-available/default  

Finaly ...

sudo /etc/init.d/apache2 restart  

. htaccess ของฉันคือ

RewriteEngine on  
RewriteCond $1 !^(index\.php|[assets/css/js/img]|robots\.txt)  
RewriteRule ^(.*)$ index.php/$1 [L]  

โมดูลผมจำเป็นต้องมีการเปิดใช้งานอีกประการหนึ่งคือactions: stackoverflow.com/questions/14419757/...
Jasdeep Khalsa

4

โซลูชันที่สมบูรณ์แบบ [ทดสอบบน localhost และโดเมนจริง]

RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule .* index.php/$0 [PT,L] 

3

นี่คือ. htaccess สำหรับหนึ่งในโครงการ CI ของฉัน:

RewriteEngine on
RewriteCond $1 !^(index\.php|images|css|js|robots\.txt)
RewriteRule ^(.*)$ /projectFolder/index.php/$1 [L] 

บรรทัดสุดท้ายควรให้สิ่งที่คุณต้องการแม้ว่าคุณอาจต้องการหรือไม่ต้องการ "/ projectFolder" ขึ้นอยู่กับวิธีการตั้งค่าโครงสร้างโฟลเดอร์ของคุณ โชคดี!



3

ในฐานะที่เป็นไฟล์. htaccess ตัวเลือกที่ดีคือการใช้ไฟล์ที่Kohana Frameworkจัดเตรียมไว้ให้:

# Turn on URL rewriting
RewriteEngine On

# Installation directory
RewriteBase /

# Protect hidden files from being viewed
<Files .*>
    Order Deny,Allow
    Deny From All
</Files>

# Protect application and system files from being viewed
RewriteRule ^(?:application|system)\b.* index.php/$0 [L]

# Allow any files or directories that exist to be displayed directly
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d

# Rewrite all other URLs to index.php/URL
RewriteRule .* index.php/$0 [PT]

มันเป็น. htaccess ที่ได้ผลดี


3

มีสองวิธีในการแก้ index.php ในเส้นทาง url สำหรับ codeigniter

1: ใน config / config.php เปลี่ยนรหัส:

$config['index_page'] = 'index.php';

ถึง

$config['index_page'] = '';

2: สร้าง. htacess ในรูทพา ธ หากไม่ได้สร้างให้คัดลอกโค้ดต่อไปนี้: -

<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php/$1 [L]
</IfModule>

บันทึกแล้วตรวจสอบใน Apache Configuration rewrite_module OR mod_rewrite ถูกเปิดใช้งานหากไม่เป็นเช่นนั้นโปรดเปิดใช้งาน (แนวทางที่ดีที่สุด)!


สิ่งนี้ถูกต้องและตรงจากเอกสาร CodeIgniter ฉันยังใช้วิธีนี้
Dewald Els

2

ฉันทดสอบสิ่งนี้บน apache2 บนโฮสติ้งที่แตกต่างกันและใช้งานได้ดี

ใช้ htaccess นี้

RewriteEngine On
RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ /index.php/$1 [L]

จะแน่ใจว่าคุณได้enabled mod_rewirteด้วยphpinfo();

จากนั้นทำใน config / config.php:

$config['index_url']    = '';
|
| 'AUTO'            Default - auto detects
| 'PATH_INFO'       Uses the PATH_INFO
| 'QUERY_STRING'    Uses the QUERY_STRING
| 'REQUEST_URI'     Uses the REQUEST_URI
| 'ORIG_PATH_INFO'  Uses the ORIG_PATH_INFO
|
*/
$config['uri_protocol'] = 'AUTO';

หากยังไม่ได้ผลให้ลองเปลี่ยนเป็นไฟล์$config['uri_protocol']='AUTO'ภายในที่ระบุไว้application/config/config.phpในบรรทัด 40/54:

บางครั้งฉันใช้: REQUEST_URIแทนAUTOหรือ"QUERY_STRING"สำหรับโฮสติ้งของ goDaddy


2

ดูใน\application\config\config.phpไฟล์มีตัวแปรชื่อindex_page

ควรมีลักษณะดังนี้

$config['index_page'] = "index.php";

เปลี่ยนเป็น

$config['index_page'] = "";

จากนั้นตามที่กล่าวไว้คุณต้องเพิ่มกฎการเขียนซ้ำลงใน.htaccessไฟล์เช่นนี้:

RewriteEngine on
RewriteCond $1 !^(index\\.php|resources|robots\\.txt)
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php/$1 [L,QSA]

มันได้ผลสำหรับฉันหวังว่าคุณจะเช่นกัน


2

หากคุณใช้ linux และใช้เซิร์ฟเวอร์ apache2 เราอาจต้องแทนที่ไฟล์ apache2.conf ข้างการเปลี่ยนแปลงในไฟล์. htaccess ค้นหาแฟ้มการกำหนดค่า apache2 บน/etc/apache2/apache2.conf

Search Directory / var / www / Change AllowOverride None -> AllowOverride All

<Directory /var/www/>
    Options Indexes FollowSymLinks
    AllowOverride All
    Require all granted
</Directory

1

วางไฟล์. htaccess ในไดเรกทอรีเว็บรากของคุณ

ไม่ว่าคุณจะปรับแต่งอะไร - หากไม่เป็นไปตามข้างต้นจะไม่ได้ผล โดยปกติจะอยู่ในโฟลเดอร์ System ควรอยู่ในรูท ไชโย!


2
หลังจากใช้เวลาสองสามชั่วโมงฉันอ่านสิ่งนี้และพบข้อผิดพลาดของฉัน
mohsin.mr

ฉันยังใช้เวลาอย่างน้อยหนึ่งชั่วโมงเพราะเคล็ดลับ "เล็กน้อย" นี้ ตามค่าเริ่มต้นไฟล์. htaccess จะอยู่ในapplicationไดเร็กทอรีแทนที่จะเป็น root
vadim

1

ฉันได้ลองวิธีแก้ปัญหามากมาย แต่สิ่งที่ฉันคิดขึ้นมาคือ:

DirectoryIndex index.php
RewriteEngine on

RewriteCond $1 !^(index\.php|(.*)\.swf|forums|images|css|downloads|jquery|js|robots  \.txt|favicon\.ico)
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ ./index.php?$1 [L,QSA]

สิ่งนี้จะลบ index.php ออกจาก url ตามต้องการ


1

ฉันใช้บรรทัดเหล่านี้ใน.htaccessไฟล์ ซึ่งฉันวางไว้ในโฟลเดอร์รูท

RewriteEngine on
RewriteRule ^(application|system|\.svn) index.php/$1 [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php/$1 [QSA,L]

จากนั้นฉันสามารถเข้าถึงhttp://example.com/controller/function/parameter

แทนhttp://example.com/index.php/controller/function/parameter


0

สิ่งนี้จะช่วยคุณวางรหัสนี้ในโฟลเดอร์ของแอปพลิเคชันในไฟล์. htacess

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php/$1 [L]  

<Files "index.php">
AcceptPathInfo On
</Files>
<IfModule mod_php5.c>
  php_value short_open_tag 1
</IfModule>

0

อันนี้ทำให้ฉันมีเวทมนตร์ที่สมบูรณ์:

RewriteEngine on
RewriteBase /
# Hide the application and system directories by redirecting the request to index.php
RewriteRule ^(application|system|\.svn) index.php/$1 [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php/$1 [QSA,L]

หวังว่าจะช่วยได้!


0

สวัสดีคนนี้ทำงานให้ฉัน

RewriteEngine on
RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ /folder/index.php?/$1 [L]

เช่นเดียวกับสิ่งนี้

RewriteEngine on
RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ /folder/index.php?/$1 [L]

โดยที่โฟลเดอร์คือชื่อของโฟลเดอร์ย่อยหากแอปพลิเคชัน codeigniter นี้โฮสต์เป็นโดเมนย่อยเช่น domainname / folder / index.php

หวังว่าจะเหมาะกับคุณ ขอบคุณ


0

คัดลอกรหัสต่อไปนี้ใน. htaccess ของคุณ

RewriteEngine on
Options -Indexes
RewriteCond $1 !^(index\.php|assets|robots\.txt)
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php/$1 [L,QSA]

แม้ว่ารหัสนี้อาจตอบคำถาม แต่การให้บริบทเพิ่มเติมเกี่ยวกับสาเหตุและ / หรือวิธีที่รหัสนี้ตอบคำถามช่วยเพิ่มมูลค่าในระยะยาว
Benjamin W.

0
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /Foldername of your ci/
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php/$1 [L]
</IfModule>

0

ขั้นตอนที่ 1 :

เพิ่มสิ่งนี้ในไฟล์ htaccess

<IfModule mod_rewrite.c> 
RewriteEngine On 
#RewriteBase / 

RewriteCond %{REQUEST_FILENAME} !-f 
RewriteRule ^ index.php [QSA,L] 
</IfModule>

ขั้นตอนที่ 2 :

ลบ index.php ในการกำหนดค่า codeigniter

$config['base_url'] = ''; 
$config['index_page'] = '';

ขั้นตอนที่ 3:

อนุญาตให้ลบล้าง htaccess ใน Apache Configuration (Command)

sudo nano /etc/apache2/apache2.conf และแก้ไขไฟล์และเปลี่ยนเป็น

AllowOverride All

สำหรับโฟลเดอร์ www

ขั้นตอนที่ 4:

เปิดใช้งาน apache mod rewrite (Command)

sudo a2enmod เขียนใหม่

ขั้นตอนที่ 5:

รีสตาร์ท Apache (คำสั่ง)

sudo /etc/init.d/apache2 restart
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.