2014-12-31 14 views
7

Tôi có điều này .htaccessURL thân thiện và mức htaccess

RewriteEngine On 
RewriteRule ^custom index.php?page=value [NC,L] 

Nó hoạt động nếu index.php và .htaccess nằm trong cùng một thư mục.

Tôi muốn đặt tệp .htaccess vào thư mục gốc và đặt nội dung trong một newFolder phản ứng với các quy tắc htaccess. Nói:

.htaccess -> root mức
index.php -> root/newFolder mức

tôi đã làm thử:

RewriteEngine On 
RewriteRule ^custom newFolder/index.php?page=value [NC,L] 

Không phản ứng ở tất cả (404) :(

Tôi đoán giải pháp phải đơn giản, nhưng ...

Bất kỳ trợ giúp nào sẽ được đánh giá cao.

+0

Bạn có muốn "tùy chỉnh" động không? Hay đó là nghĩa vụ phải được mã hóa cứng? Ngoài ra, bạn có muốn "giá trị", sau "page =", phải động không? Nếu vậy, bạn muốn lấy giá trị của "giá trị" ở đâu? : S – bloodyKnuckles

Trả lời

6

Hãy chắc chắn rằng chúng tôi đang ở trên cùng một trang. ;) Trong thư mục máy chủ gốc của tôi, tôi có một tập tin .htaccess và trong tập tin mà tôi có:

RewriteEngine On 
RewriteRule ^(.+/)?custom $1index.php?page=value [NC,L] 

Các RewriteRule có ba thành phần: một mô hình phù hợp, một mục tiêu, và một danh sách các cờ. Mẫu đối sánh có thể chứa văn bản thuần túy hoặc cụm từ thông dụng.Mục tiêu có thể chứa văn bản thuần hoặc văn bản với các biến xen kẽ được ghi lại trong mẫu đối sánh cụm từ thông dụng. Cả hai mô hình phù hợp và mục tiêu có liên quan đến thư mục tập tin .htaccess nằm ở.

Các mô hình trận đấu được so sánh với văn bản trong URL đó là sau khi thư mục hiện hành. Nếu có một trận đấu thành công thì mục tiêu được gọi từ thư mục .htaccess tệp đang ở. Nếu thông tin được ghi lại trong mẫu đối sánh thì các biến trong mục tiêu được nội suy đầu tiên trong mục tiêu.

Trong ví dụ này các tập tin .htaccess được trong thư mục gốc máy chủ do đó mô hình trận đấu được so sánh với văn bản URL sau: http://localhost/

Để kiểm tra nó ra, đây là các mã PHP tôi đặt trong một chỉ số .php file:

<?php 

echo 'page value: ' .$_GET['page'] . '<br>'; 
echo 'script loaded: ' . $_SERVER['PHP_SELF']; 

?> 

Khi tôi hướng đến http://localhost/custom trong trình duyệt của tôi: mô hình phù hợp với biểu thức chính quy được so sánh với chuỗi "tùy chỉnh", có một trận đấu thành công do đó chỉ tiêu index.php?page=value được thực hiện và tôi nhận được trang index.php trong thư mục gốc được tải. Trang hiển thị trông như thế này:

page value: value 
script loaded: /index.php 

Tiếp theo tôi tạo một thư mục mới có tên gọi "newFolder" trong thư mục gốc máy chủ và sao chép các tập tin index.php vào thư mục mới được tạo ra.

Khi tôi hướng đến http://localhost/newFolder/custom trong trình duyệt của tôi: mô hình phù hợp với biểu thức chính quy được so sánh với chuỗi "newFolder/tùy chỉnh", một lần nữa có một trận đấu thành công, lần này mục tiêu newFolder/index.php?page=value được thực thi, và tôi nhận được index.php trang trong thư mục newFolder được tải. Trang hiển thị giờ đây trông như thế này:

page value: value 
script loaded: /newFolder/index.php 

Vì vậy, tương tự như vậy, tôi có thể tạo ra bất kỳ số lượng các thư mục trong thư mục gốc và file index.php mới trong những thư mục, và khi điều hướng đến "tùy chỉnh" trong những thư mục , tệp này .htaccess phải tải tệp index.php tương ứng trong thư mục con hiện tại.

~~~

tôi sẽ đi ra ngoài cánh một ở đây và giả sử bạn muốn tải các trang tự động, do đó nắm bắt được "tùy chỉnh" như một tên trang năng động và đổ nó trong lĩnh vực trang (thay thế "value") và gửi nó đến tệp index.php trong thư mục con hiện tại.

RewriteEngine On 

RewriteCond %{REQUEST_URI} !index\.php 
RewriteRule ^(.+/)?(.+)$ $1index.php?page=$2 [NC,L] 

Như đã đề cập, dấu ngoặc đơn nắm bắt văn bản động và đổ nó vào chuỗi đích có số ký hiệu đô la. Vì vậy, văn bản được ghi trong tập hợp dấu ngoặc đơn đầu tiên thay thế "$ 1" và văn bản được ghi trong tập thứ hai thay thế "$ 2". Tôi cũng đã thêm tuyên bố RewriteCond để ngăn quy tắc này không bị nhúng đôi. :) Nếu tôi không quy tắc này được thực hiện cho cả cuộc gọi "tùy chỉnh" VÀ chuyển hướng đến index.php.

Vì vậy, bây giờ khi tôi hướng đến http://localhost/newFolder/whoopdeedoo, mô hình phù hợp với regex được so sánh với "newFolder/whoopdeedoo", có một trận đấu thành công, mục tiêu newFolder/index.php?page=whoopdeedoo được thực thi, và tôi nhận được:

page value: whoopdeedoo 
script loaded: /newFolder/index.php 

~~~

Khi có nguy cơ droning, đây là một số thông tin cơ bản. Bạn đã đề cập điều này hoạt động trong thư mục gốc:

RewriteEngine On 
RewriteRule ^custom index.php?page=value [NC,L] 

Nhưng nó không hoạt động khi điều hướng trình duyệt của bạn đến thư mục con. Sau khi đọc các ý kiến, dường như bạn phát hiện ra chút sau này làm việc cho các thư mục con, đặc biệt là "newFolder":

RewriteEngine On 
RewriteRule ^newFolder/custom newFolder/index.php?page=value [NC,L] 

Nhưng bây giờ nó không còn làm việc cho thư mục gốc. Vì vậy, bạn có thể chỉ cần bao gồm cả hai:

RewriteEngine On 
RewriteRule ^custom index.php?page=value [NC,L] 
RewriteRule ^newFolder/custom newFolder/index.php?page=value [NC,L] 

Tuy nhiên có một vài điều ở đây nhảy ra khỏi tôi. Một là thay vì tên thư mục mã hóa trong gốc của tôi .htaccess Tôi muốn đặt các tệp .htaccess vào từng thư mục con và tiếp quản quá trình xử lý URL ở đó.

Nhưng nếu vì lý do nào đó, bạn muốn duy trì một tệp .htaccess trong thư mục gốc, thì những gì nhảy ra khỏi tôi là trùng lặp trong quy tắc. Vì vậy, cách khác, bạn có thể sử dụng biểu thức thông thường để làm cho thư mục con đặt tên cho một biến bắt, như hiển thị ở phía trên cùng của câu trả lời này:

RewriteEngine On 
RewriteRule ^(.+/)?custom $1index.php?page=value [NC,L] 

Các regex ngoặc chụp thay thế văn bản "newFolder /", và bên trong dấu ngoặc đơn chúng tôi đang nói, "chụp một hoặc nhiều ký tự theo sau là dấu gạch chéo". Sau đó, nếu có kết quả thành công, giá trị được ghi lại sẽ thay thế "$ 1" trong mục tiêu. Lý do này cũng hoạt động trong thư mục gốc là vì dấu chấm hỏi sau dấu ngoặc đơn làm cho regex bên trong các tùy chọn parens. Vì vậy, nếu không có gì trước khi "tùy chỉnh" chúng tôi vẫn còn tốt cho một trận đấu. Trong trường hợp đó, "$ 1" được thay thế bằng một chuỗi rỗng.

+0

Đó là chính xác những gì tôi đang tìm kiếm: url tùy chỉnh động cho dự án cụ thể này. Dù sao, tất cả các thông tin bạn gửi là khá hữu ích. Rất cám ơn bloodyKnuckles, và có một năm mới tốt đẹp. :) – Sergio

+0

Câu trả lời chi tiết rất tốt +1 – anubhava

+0

@ anubhava: câu trả lời hay và chính xác. Dễ dàng bỏ rơi. Vì vậy, chúng tôi có một người bạn đời rất tài năng ở đây :) – Sergio

5

Hãy thử với rewriterule này:

# Activate RewriteEngine 
RewriteEngine on 

# Rewrite the URL requested by the user 
# Entry: folder/clients/name/ 
# Output: folder/clients.php?id=name 
RewriteRule ^folder/clients/(\w+)/?$ /folder/clients.php?id=$1 

Giải thích về RewriteRule này:

phần đầu tiên của rewriterule:

  1. ^Lên trên biểu
  2. folder/clients/Chuỗi URL được yêu cầu bắt đầu với folder/clients/
  3. (\w+)Capture bất kỳ chữ cái theo và lưu trữ nó trong $1
  4. /?xuyệc ngược Tùy chọn ở phần cuối của URL
  5. $End của biểu thức

Phần thứ hai của các rewriterule:

  1. clients.php?id=Tiêu chuỗi
  2. $1Việc bắt giữ đầu tiên chúng ta đã thấy trong phần đầu tiên
+0

Không hoạt động. "khách hàng", trong mã của bạn, là một thư mục hoặc có thể là một từ tùy chỉnh? Cảm ơn vì đã trả lời. – Sergio

+0

Tôi đã chỉnh sửa câu trả lời của mình. Tôi nghĩ rằng bạn cần phải viết tên của thư mục con bên trong 'RewriteRule'. – tomloprod

+0

Có lẽ câu trả lời này có thể hữu ích hơn cho bạn: http://stackoverflow.com/questions/9262720/htaccess-pretty-url-rewrite-for-php-pages-in-a-subfolder – tomloprod

Các vấn đề liên quan